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 2019/10/09 14:46:49 UTC

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

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

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


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

commit b21bc6dec1d6b9b2f0a4ee919293d4a812178bde
Author: jenkins <bu...@apache.org>
AuthorDate: Wed Oct 9 14:46:32 2019 +0000

    Published site at fdac2ddc81c785d9e6d44465d8d4893c15fdab72.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 apidocs/index-all.html                             |    2 +
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html |    6 +-
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html |    6 +-
 .../org/apache/hadoop/hbase/util/VersionInfo.html  |   33 +-
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html | 1290 ++++++-----
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html |  483 ++--
 .../org/apache/hadoop/hbase/util/VersionInfo.html  |   10 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |  118 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/constant-values.html                    |   11 +-
 devapidocs/index-all.html                          |    4 +
 devapidocs/org/apache/hadoop/hbase/Version.html    |   20 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    2 +-
 .../hadoop/hbase/client/class-use/RegionInfo.html  |   10 +
 .../apache/hadoop/hbase/client/package-tree.html   |   16 +-
 .../hadoop/hbase/coprocessor/package-tree.html     |    2 +-
 .../apache/hadoop/hbase/executor/package-tree.html |    2 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |   10 +-
 .../org/apache/hadoop/hbase/http/package-tree.html |    2 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    2 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |    2 +-
 .../mapreduce/HFileOutputFormat2.WriterLength.html |    8 +-
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html |   40 +-
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html |   16 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    4 +-
 .../hbase/master/assignment/AssignmentManager.html |  221 +-
 .../assignment/class-use/RegionStateNode.html      |   11 +-
 .../hbase/master/assignment/package-tree.html      |    2 +-
 .../hadoop/hbase/master/balancer/package-tree.html |    2 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    6 +-
 .../hbase/master/procedure/package-tree.html       |    6 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   18 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   18 +-
 .../regionserver/querymatcher/package-tree.html    |    4 +-
 .../hbase/regionserver/wal/package-tree.html       |    4 +-
 .../hadoop/hbase/replication/package-tree.html     |    2 +-
 .../hadoop/hbase/security/access/package-tree.html |    4 +-
 .../apache/hadoop/hbase/security/package-tree.html |    2 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |    2 +-
 .../hbase/tmpl/master/RSGroupListTmplImpl.html     |    4 +-
 .../tmpl/master/RegionServerListTmplImpl.html      |    8 +-
 .../tmpl/regionserver/RegionListTmplImpl.html      |    4 +-
 .../org/apache/hadoop/hbase/util/VersionInfo.html  |   37 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |   10 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |   18 +-
 .../mapreduce/HFileOutputFormat2.TableInfo.html    | 1290 ++++++-----
 .../mapreduce/HFileOutputFormat2.WriterLength.html | 1290 ++++++-----
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html | 1290 ++++++-----
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html |  483 ++--
 ...ignmentManager.DeadServerMetricRegionChore.html |  339 +--
 .../AssignmentManager.RegionInTransitionChore.html |  339 +--
 .../AssignmentManager.RegionInTransitionStat.html  |  339 +--
 ...AssignmentManager.RegionMetaLoadingVisitor.html |  339 +--
 .../hbase/master/assignment/AssignmentManager.html |  339 +--
 .../hbase/tmpl/master/RSGroupListTmplImpl.html     |  556 ++---
 .../tmpl/master/RegionServerListTmplImpl.html      |  903 ++++----
 .../tmpl/regionserver/RegionListTmplImpl.html      |  406 ++--
 .../org/apache/hadoop/hbase/util/VersionInfo.html  |   10 +-
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-tracking.html                                |    2 +-
 mail-lists.html                                    |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 project-summary.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 source-repository.html                             |    2 +-
 sponsors.html                                      |    2 +-
 supportingprojects.html                            |    2 +-
 team-list.html                                     |    2 +-
 testdevapidocs/index-all.html                      |    4 +
 .../apache/hadoop/hbase/backup/package-tree.html   |    2 +-
 .../hadoop/hbase/chaos/actions/package-tree.html   |    2 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    2 +-
 .../hbase/mapreduce/TestHFileOutputFormat2.html    |   76 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   12 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    6 +-
 .../hadoop/hbase/rsgroup/TestRSGroupsKillRS.html   |   68 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |    6 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 ...FileOutputFormat2.RandomKVGeneratingMapper.html | 2307 ++++++++++----------
 ...ileOutputFormat2.RandomPutGeneratingMapper.html | 2307 ++++++++++----------
 .../hbase/mapreduce/TestHFileOutputFormat2.html    | 2307 ++++++++++----------
 .../hadoop/hbase/rsgroup/TestRSGroupsKillRS.html   |  458 ++--
 104 files changed, 9223 insertions(+), 8815 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 5cade84..e0bd06b 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -443,7 +443,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 0275aa9..c632108 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20191008143853+00'00')
-/CreationDate (D:20191008143853+00'00')
+/ModDate (D:20191009144328+00'00')
+/CreationDate (D:20191009144328+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index fd4aa34..d79c74d 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -6559,6 +6559,8 @@
 <dd>
 <div class="block">get the value</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/VersionInfo.html#getMajorVersion-java.lang.String-">getMajorVersion(String)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/VersionInfo.html" title="class in org.apache.hadoop.hbase.util">VersionInfo</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Result.html#getMap--">getMap()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></dt>
 <dd>
 <div class="block">Map of families to all versions of its qualifiers and values.</div>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html b/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
index b029a44..8d39c7f 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
@@ -426,7 +426,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoad</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.581">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.577">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;table,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a>&nbsp;regionLocator)
                                      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>
@@ -454,7 +454,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoad</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.600">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.596">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a>&nbsp;regionLocator)
                                      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>
@@ -482,7 +482,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>configureIncrementalLoadMap</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.686">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.682">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                                <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor)
                                         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>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index b8f4fc7..c8fe065 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -1286,7 +1286,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>buildDependencyClasspath</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.833">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.834">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns a classpath string built from the content of the "tmpjars" value in <code>conf</code>.
  Also exposed to shell scripts via `bin/hbase mapredcp`.</div>
 </li>
@@ -1297,7 +1297,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>addDependencyJars</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.857">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.858">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
                               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">Add the HBase dependency jars as well as jars for any of the configured
  job classes to the job configuration, so that JobClient will ship them
@@ -1315,7 +1315,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <li class="blockList">
 <h4>addDependencyJars</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.886">addDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.887">addDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;...&nbsp;classes)
                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 1.3.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#addDependencyJars-org.apache.hadoop.mapreduce.Job-"><code>addDependencyJars(Job)</code></a>
diff --git a/apidocs/org/apache/hadoop/hbase/util/VersionInfo.html b/apidocs/org/apache/hadoop/hbase/util/VersionInfo.html
index 2fb48f7..881a827 100644
--- a/apidocs/org/apache/hadoop/hbase/util/VersionInfo.html
+++ b/apidocs/org/apache/hadoop/hbase/util/VersionInfo.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -160,48 +160,52 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>static int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getMajorVersion-java.lang.String-">getMajorVersion</a></span>(<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;version)</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getRevision--">getRevision</a></span>()</code>
 <div class="block">Get the subversion revision number for the root directory</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getSrcChecksum--">getSrcChecksum</a></span>()</code>
 <div class="block">Get the checksum of the source files from which Hadoop was compiled.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getUrl--">getUrl</a></span>()</code>
 <div class="block">Get the subversion URL for the root hbase directory.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getUser--">getUser</a></span>()</code>
 <div class="block">The user that compiled hbase.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getVersion--">getVersion</a></span>()</code>
 <div class="block">Get the hbase version.</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#logVersion--">logVersion</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#main-java.lang.String:A-">main</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#writeTo-java.io.PrintStream-">writeTo</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html?is-external=true" title="class or interface in java.io">PrintStream</a>&nbsp;out)</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#writeTo-java.io.PrintWriter-">writeTo</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html?is-external=true" title="class or interface in java.io">PrintWriter</a>&nbsp;out)</code>&nbsp;</td>
 </tr>
@@ -365,13 +369,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                                  <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;v2)</pre>
 </li>
 </ul>
+<a name="getMajorVersion-java.lang.String-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getMajorVersion</h4>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/VersionInfo.html#line.169">getMajorVersion</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;version)</pre>
+</li>
+</ul>
 <a name="main-java.lang.String:A-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/VersionInfo.html#line.169">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/VersionInfo.html#line.173">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 </li>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
index 3a09c42..6379267 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
@@ -243,9 +243,9 @@
 <span class="sourceLineNo">235</span>      // Map of families to writers and how much has been output on the writer.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>      private final Map&lt;byte[], WriterLength&gt; writers =<a name="line.236"></a>
 <span class="sourceLineNo">237</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      private byte[] previousRow = HConstants.EMPTY_BYTE_ARRAY;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      private boolean rollRequested = false;<a name="line.240"></a>
+<span class="sourceLineNo">238</span>      private final Map&lt;byte[], byte[]&gt; previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
 <span class="sourceLineNo">242</span>      @Override<a name="line.242"></a>
 <span class="sourceLineNo">243</span>      public void write(ImmutableBytesWritable row, V cell)<a name="line.243"></a>
@@ -294,658 +294,654 @@
 <span class="sourceLineNo">286</span>          configureStoragePolicy(conf, fs, tableAndFamily, writerPath);<a name="line.286"></a>
 <span class="sourceLineNo">287</span>        }<a name="line.287"></a>
 <span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          this.rollRequested = true;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>        // This can only happen once a row is finished though<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        if (rollRequested &amp;&amp; Bytes.compareTo(this.previousRow, rowKey) != 0) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          rollWriters(wl);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        // create a new WAL writer, if necessary<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        if (wl == null || wl.writer == null) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            HRegionLocation loc = null;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>            if (tableName != null) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>                     RegionLocator locator =<a name="line.305"></a>
-<span class="sourceLineNo">306</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>                loc = locator.getRegionLocation(rowKey);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>              } catch (Throwable e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                loc = null;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>              } }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>            if (null == loc) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              if (LOG.isTraceEnabled()) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.316"></a>
-<span class="sourceLineNo">317</span>                  Bytes.toString(rowKey));<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>            } else {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>              if (LOG.isDebugEnabled()) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>              }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>              InetSocketAddress initialIsa =<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>              if (initialIsa.isUnresolved()) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>                if (LOG.isTraceEnabled()) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.328"></a>
-<span class="sourceLineNo">329</span>                      + loc.getPort() + ", so use default writer");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>              } else {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>                if (LOG.isDebugEnabled()) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<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>          } else {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>        // we now have the proper WAL writer. full steam ahead<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        wl.writer.append(kv);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        wl.written += length;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>        // Copy the row so we know when a row transition.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        this.previousRow = rowKey;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        String[] tableNameParts = tableName.split(":");<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        if (tableNameParts.length &gt; 1) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        return tableRelPath;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        if (writerLength != null) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          closeWriter(writerLength);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          for (WriterLength wl : this.writers.values()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            closeWriter(wl);<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>        this.rollRequested = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        if (wl.writer != null) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          LOG.info(<a name="line.376"></a>
-<span class="sourceLineNo">377</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          close(wl.writer);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        wl.writer = null;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        wl.written = 0;<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>       * Create a new StoreFile.Writer.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>       * @param family<a name="line.386"></a>
-<span class="sourceLineNo">387</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>       * @throws IOException<a name="line.388"></a>
-<span class="sourceLineNo">389</span>       */<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          justification="Not important")<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        if (writeMultipleTables) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          familydir = new Path(outputDir,<a name="line.397"></a>
-<span class="sourceLineNo">398</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        WriterLength wl = new WriterLength();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Algorithm compression = overriddenCompression;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        compression = compression == null ? defaultCompression : compression;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                                    .withCompression(compression)<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                                    .withBlockSize(blockSize);<a name="line.419"></a>
+<span class="sourceLineNo">289</span>        // This can only happen once a row is finished though<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span>                &amp;&amp; Bytes.compareTo(this.previousRows.get(family), rowKey) != 0) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          rollWriters(wl);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>        // create a new WAL writer, if necessary<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (wl == null || wl.writer == null) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            HRegionLocation loc = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>            if (tableName != null) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>                     RegionLocator locator =<a name="line.302"></a>
+<span class="sourceLineNo">303</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                loc = locator.getRegionLocation(rowKey);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>              } catch (Throwable e) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.306"></a>
+<span class="sourceLineNo">307</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>                loc = null;<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>            if (null == loc) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>              if (LOG.isTraceEnabled()) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>                  Bytes.toString(rowKey));<a name="line.314"></a>
+<span class="sourceLineNo">315</span>              }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            } else {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>              if (LOG.isDebugEnabled()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>              }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              InetSocketAddress initialIsa =<a name="line.321"></a>
+<span class="sourceLineNo">322</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>              if (initialIsa.isUnresolved()) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>                if (LOG.isTraceEnabled()) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.325"></a>
+<span class="sourceLineNo">326</span>                      + loc.getPort() + ", so use default writer");<a name="line.326"></a>
+<span class="sourceLineNo">327</span>                }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>              } else {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>                if (LOG.isDebugEnabled()) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>                }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<a name="line.333"></a>
+<span class="sourceLineNo">334</span>                });<a name="line.334"></a>
+<span class="sourceLineNo">335</span>              }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>            }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          } else {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<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>        // we now have the proper WAL writer. full steam ahead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        wl.writer.append(kv);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        wl.written += length;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>        // Copy the row so we know when a row transition.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        this.previousRows.put(family, rowKey);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        String[] tableNameParts = tableName.split(":");<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        if (tableNameParts.length &gt; 1) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        return tableRelPath;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        if (writerLength != null) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          closeWriter(writerLength);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        } else {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          for (WriterLength wl : this.writers.values()) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>            closeWriter(wl);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        if (wl.writer != null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          LOG.info(<a name="line.372"></a>
+<span class="sourceLineNo">373</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          close(wl.writer);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        wl.writer = null;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        wl.written = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      /*<a name="line.380"></a>
+<span class="sourceLineNo">381</span>       * Create a new StoreFile.Writer.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>       * @param family<a name="line.382"></a>
+<span class="sourceLineNo">383</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>       * @throws IOException<a name="line.384"></a>
+<span class="sourceLineNo">385</span>       */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          justification="Not important")<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.388"></a>
+<span class="sourceLineNo">389</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        if (writeMultipleTables) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          familydir = new Path(outputDir,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        WriterLength wl = new WriterLength();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        Algorithm compression = overriddenCompression;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        compression = compression == null ? defaultCompression : compression;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                                    .withCompression(compression)<a name="line.412"></a>
+<span class="sourceLineNo">413</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.413"></a>
+<span class="sourceLineNo">414</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.414"></a>
+<span class="sourceLineNo">415</span>                                    .withBlockSize(blockSize);<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          contextBuilder.withIncludesTags(true);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          contextBuilder.withIncludesTags(true);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        if (null == favoredNodes) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          wl.writer =<a name="line.428"></a>
-<span class="sourceLineNo">429</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        } else {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          wl.writer =<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.434"></a>
-<span class="sourceLineNo">435</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>                  .withFavoredNodes(favoredNodes).build();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">421</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        if (null == favoredNodes) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          wl.writer =<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        } else {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          wl.writer =<a name="line.429"></a>
+<span class="sourceLineNo">430</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  .withFavoredNodes(favoredNodes).build();<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>        this.writers.put(tableAndFamily, wl);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        return wl;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
 <span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>        this.writers.put(tableAndFamily, wl);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return wl;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (w != null) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.446"></a>
-<span class="sourceLineNo">447</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toBytes(true));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.452"></a>
-<span class="sourceLineNo">453</span>              Bytes.toBytes(compactionExclude));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          w.appendTrackedTimestampsToMetadata();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          w.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      @Override<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      public void close(TaskAttemptContext c)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException, InterruptedException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        for (WriterLength wl: this.writers.values()) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          close(wl.writer);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    };<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>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Configure block storage policy for CF after the directory is created.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   */<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      return;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    String policy =<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  /*<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  static class WriterLength {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    long written = 0;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    StoreFileWriter writer = null;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  }<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>   * Return the start keys of all of the regions in this table,<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * as a list of ImmutableBytesWritable.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                                                                 boolean writeMultipleTables)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      TableName tableName = regionLocator.getName();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      for (byte[] byteKey : byteKeys) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (writeMultipleTables)<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          //MultiTableHFileOutputFormat use case<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.511"></a>
+<span class="sourceLineNo">440</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        if (w != null) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>              Bytes.toBytes(true));<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>              Bytes.toBytes(compactionExclude));<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          w.appendTrackedTimestampsToMetadata();<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          w.close();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>      @Override<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      public void close(TaskAttemptContext c)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException, InterruptedException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        for (WriterLength wl: this.writers.values()) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          close(wl.writer);<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>    };<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * Configure block storage policy for CF after the directory is created.<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      return;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>    String policy =<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  /*<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  static class WriterLength {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    long written = 0;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    StoreFileWriter writer = null;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  /**<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * Return the start keys of all of the regions in this table,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * as a list of ImmutableBytesWritable.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   */<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>                                                                 boolean writeMultipleTables)<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          throws IOException {<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      TableName tableName = regionLocator.getName();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      for (byte[] byteKey : byteKeys) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        if (writeMultipleTables)<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          //MultiTableHFileOutputFormat use case<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        if (LOG.isDebugEnabled()) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.510"></a>
+<span class="sourceLineNo">511</span>                  (fullKey) + "]");<a name="line.511"></a>
 <span class="sourceLineNo">512</span>        }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>        if (LOG.isDebugEnabled()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.514"></a>
-<span class="sourceLineNo">515</span>                  (fullKey) + "]");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    return ret;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>  /**<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  @SuppressWarnings("deprecation")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (startKeys.isEmpty()) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      throw new IllegalArgumentException("No regions passed");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    // We're generating a list of split points, and we don't ever<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // empty reducer with index 0<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    ImmutableBytesWritable first = sorted.first();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    if (writeMultipleTables) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.542"></a>
-<span class="sourceLineNo">543</span>              ().get()));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      throw new IllegalArgumentException(<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "First region of table should have empty start key. Instead has: "<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          + Bytes.toStringBinary(first.get()));<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    sorted.remove(sorted.first());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>    // Write the actual file<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      NullWritable.class);<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>    try {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        writer.append(startKey, NullWritable.get());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      writer.close();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  /**<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * table. This<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * &lt;ul&gt;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * &lt;/ul&gt;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * running this function.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * table. This<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * &lt;ul&gt;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * &lt;/ul&gt;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * running this function.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
-<span class="sourceLineNo">600</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      RegionLocator regionLocator) throws IOException {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Configuration conf = job.getConfiguration();<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    job.setOutputFormatClass(cls);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    boolean writeMultipleTables = false;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      writeMultipleTables = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // sort the incoming values.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      job.setReducerClass(CellSortReducer.class);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      job.setReducerClass(PutSortReducer.class);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      job.setReducerClass(TextSortReducer.class);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    } else {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
+<span class="sourceLineNo">513</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return ret;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>  /**<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  @SuppressWarnings("deprecation")<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    if (startKeys.isEmpty()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      throw new IllegalArgumentException("No regions passed");<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    // We're generating a list of split points, and we don't ever<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    // empty reducer with index 0<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    ImmutableBytesWritable first = sorted.first();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    if (writeMultipleTables) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              ().get()));<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    }<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      throw new IllegalArgumentException(<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          "First region of table should have empty start key. Instead has: "<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          + Bytes.toStringBinary(first.get()));<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    sorted.remove(sorted.first());<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Write the actual file<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      NullWritable.class);<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>    try {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        writer.append(startKey, NullWritable.get());<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    } finally {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      writer.close();<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">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>  /**<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   * table. This<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   * &lt;ul&gt;<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>   * &lt;/ul&gt;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   * running this function.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   */<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      throws IOException {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>  }<a name="line.580"></a>
+<span class="sourceLineNo">581</span><a name="line.581"></a>
+<span class="sourceLineNo">582</span>  /**<a name="line.582"></a>
+<span class="sourceLineNo">583</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * table. This<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * &lt;ul&gt;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * &lt;/ul&gt;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * running this function.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   */<a name="line.595"></a>
+<span class="sourceLineNo">596</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      RegionLocator regionLocator) throws IOException {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    Configuration conf = job.getConfiguration();<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    job.setOutputFormatClass(cls);<a name="line.608"></a>
+<span class="sourceLineNo">609</span><a name="line.609"></a>
+<span class="sourceLineNo">610</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    boolean writeMultipleTables = false;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      writeMultipleTables = true;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // sort the incoming values.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      job.setReducerClass(CellSortReducer.class);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      job.setReducerClass(PutSortReducer.class);<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      job.setReducerClass(TextSortReducer.class);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    } else {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        CellSerialization.class.getName());<a name="line.634"></a>
 <span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        CellSerialization.class.getName());<a name="line.638"></a>
+<span class="sourceLineNo">636</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
 <span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    /* Now get the region start keys for every table required */<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      String tn = writeMultipleTables?<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      allTableNames.add(tn);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.659"></a>
-<span class="sourceLineNo">660</span>            .toString(tableSeparator)));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    // Use table's region boundaries for TOP split points.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        "to match current region count for all tables");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    job.setNumReduceTasks(startKeys.size());<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    // Set compression algorithms based on column families<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.670"></a>
+<span class="sourceLineNo">640</span>    /* Now get the region start keys for every table required */<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      String tn = writeMultipleTables?<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.649"></a>
+<span class="sourceLineNo">650</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      allTableNames.add(tn);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>            .toString(tableSeparator)));<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    // Use table's region boundaries for TOP split points.<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        "to match current region count for all tables");<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    job.setNumReduceTasks(startKeys.size());<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    // Set compression algorithms based on column families<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.666"></a>
+<span class="sourceLineNo">667</span>            tableDescriptors));<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            tableDescriptors));<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.670"></a>
 <span class="sourceLineNo">671</span>            tableDescriptors));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>            tableDescriptors));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            tableDescriptors));<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        tableDescriptors));<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.678"></a>
-<span class="sourceLineNo">679</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    TableMapReduceUtil.initCredentials(job);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">672</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        tableDescriptors));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.674"></a>
+<span class="sourceLineNo">675</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    TableMapReduceUtil.initCredentials(job);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.679"></a>
+<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
+<span class="sourceLineNo">681</span><a name="line.681"></a>
+<span class="sourceLineNo">682</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      IOException {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    Configuration conf = job.getConfiguration();<a name="line.684"></a>
 <span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      IOException {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    Configuration conf = job.getConfiguration();<a name="line.688"></a>
+<span class="sourceLineNo">686</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // Set compression algorithms based on column families<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.708"></a>
-<span class="sourceLineNo">709</span><a name="line.709"></a>
-<span class="sourceLineNo">710</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    TableMapReduceUtil.initCredentials(job);<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.712"></a>
-<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>  /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   * map from the configuration.<a name="line.717"></a>
-<span class="sourceLineNo">718</span>   *<a name="line.718"></a>
-<span class="sourceLineNo">719</span>   * @param conf to read the serialized values from<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * @return a map from column family to the configured compression algorithm<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  @VisibleForTesting<a name="line.722"></a>
-<span class="sourceLineNo">723</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return compressionMap;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  /**<a name="line.735"></a>
-<span class="sourceLineNo">736</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.736"></a>
-<span class="sourceLineNo">737</span>   * map from the configuration.<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   *<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * @param conf to read the serialized values from<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   * @return a map from column family to the the configured bloom filter type<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  @VisibleForTesting<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    return bloomTypeMap;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   * map from the configuration.<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   *<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @param conf to read the serialized values from<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   * @return a map from column family to the the configured bloom filter param<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   */<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  @VisibleForTesting<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>  /**<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * Runs inside the task to deserialize column family to block size<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * map from the configuration.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   *<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   * @param conf to read the serialized values from<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @return a map from column family to the configured block size<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   */<a name="line.773"></a>
-<span class="sourceLineNo">774</span>  @VisibleForTesting<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    return blockSizeMap;<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   * type map from the configuration.<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   *<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * @param conf to read the serialized values from<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   *         configured data block type for the family<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   */<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  @VisibleForTesting<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    return encoderMap;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   *<a name="line.809"></a>
-<span class="sourceLineNo">810</span>   * @param conf to read the serialized values from<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * @param confName conf key to read from the configuration<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @return a map of column family to the given configuration value<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      Configuration conf, String confName) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    String confVal = conf.get(confName, "");<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      String[] familySplit = familyConf.split("=");<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      if (familySplit.length != 2) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>        continue;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      }<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.824"></a>
-<span class="sourceLineNo">825</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      } catch (UnsupportedEncodingException e) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        // will not happen with UTF-8 encoding<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        throw new AssertionError(e);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return confValMap;<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   */<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          writeMultipleTables)<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      throws IOException {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    Configuration conf = job.getConfiguration();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    // create the partitions file<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    FileSystem fs = FileSystem.get(conf);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    String hbaseTmpFsDir =<a name="line.844"></a>
-<span class="sourceLineNo">845</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    fs.makeQualified(partitionsPath);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    fs.deleteOnExit(partitionsPath);<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>    // configure job to use it<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>  }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.857"></a>
-<span class="sourceLineNo">858</span>  @VisibleForTesting<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      throws UnsupportedEncodingException {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int i = 0;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      if (tableDescriptor == null) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        // could happen with mock table instance<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        return "";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        if (i++ &gt; 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          attributeValue.append('&amp;');<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(<a name="line.873"></a>
-<span class="sourceLineNo">874</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.874"></a>
-<span class="sourceLineNo">875</span>            "UTF-8"));<a name="line.875"></a>
-<span class="sourceLineNo">876</span>        attributeValue.append('=');<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    // Get rid of the last ampersand<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    return attributeValue.toString();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  }<a name="line.882"></a>
-<span class="sourceLineNo">883</span><a name="line.883"></a>
-<span class="sourceLineNo">884</span>  /**<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * Invoked while configuring the MR job for incremental load.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  @VisibleForTesting<a name="line.888"></a>
-<span class="sourceLineNo">889</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>          familyDescriptor.getCompressionType().getName();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>  /**<a name="line.892"></a>
-<span class="sourceLineNo">893</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * configuring the MR job for incremental load.<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   */<a name="line.895"></a>
-<span class="sourceLineNo">896</span>  @VisibleForTesting<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   * configuring the MR job for incremental load.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   */<a name="line.903"></a>
-<span class="sourceLineNo">904</span>  @VisibleForTesting<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    if (bloomType == null) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    return bloomType;<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  };<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * configuring the MR job for incremental load.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   */<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  @VisibleForTesting<a name="line.917"></a>
-<span class="sourceLineNo">918</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    String bloomParam = "";<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    return bloomParam;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>  };<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>  /**<a name="line.927"></a>
-<span class="sourceLineNo">928</span>   * Serialize column family to data block encoding map to configuration.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * Invoked while configuring the MR job for incremental load.<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  @VisibleForTesting<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (encoding == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      encoding = DataBlockEncoding.NONE;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return encoding.toString();<a name="line.937"></a>
-<span class="sourceLineNo">938</span>  };<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>}<a name="line.940"></a>
+<span class="sourceLineNo">690</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    // Set compression algorithms based on column families<a name="line.694"></a>
+<span class="sourceLineNo">695</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.699"></a>
+<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.704"></a>
+<span class="sourceLineNo">705</span><a name="line.705"></a>
+<span class="sourceLineNo">706</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    TableMapReduceUtil.initCredentials(job);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   * map from the configuration.<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   *<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * @param conf to read the serialized values from<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * @return a map from column family to the configured compression algorithm<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
+<span class="sourceLineNo">718</span>  @VisibleForTesting<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.721"></a>
+<span class="sourceLineNo">722</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    return compressionMap;<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>  /**<a name="line.731"></a>
+<span class="sourceLineNo">732</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.732"></a>
+<span class="sourceLineNo">733</span>   * map from the configuration.<a name="line.733"></a>
+<span class="sourceLineNo">734</span>   *<a name="line.734"></a>
+<span class="sourceLineNo">735</span>   * @param conf to read the serialized values from<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * @return a map from column family to the the configured bloom filter type<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   */<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  @VisibleForTesting<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    }<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    return bloomTypeMap;<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   * map from the configuration.<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   *<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @param conf to read the serialized values from<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * @return a map from column family to the the configured bloom filter param<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   */<a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @VisibleForTesting<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  /**<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * Runs inside the task to deserialize column family to block size<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * map from the configuration.<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   *<a name="line.766"></a>
+<span class="sourceLineNo">767</span>   * @param conf to read the serialized values from<a name="line.767"></a>
+<span class="sourceLineNo">768</span>   * @return a map from column family to the configured block size<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   */<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  @VisibleForTesting<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.772"></a>
+<span class="sourceLineNo">773</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    return blockSizeMap;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  /**<a name="line.782"></a>
+<span class="sourceLineNo">783</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.783"></a>
+<span class="sourceLineNo">784</span>   * type map from the configuration.<a name="line.784"></a>
+<span class="sourceLineNo">785</span>   *<a name="line.785"></a>
+<span class="sourceLineNo">786</span>   * @param conf to read the serialized values from<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   *         configured data block type for the family<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   */<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  @VisibleForTesting<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    }<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return encoderMap;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span><a name="line.802"></a>
+<span class="sourceLineNo">803</span>  /**<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   *<a name="line.805"></a>
+<span class="sourceLineNo">806</span>   * @param conf to read the serialized values from<a name="line.806"></a>
+<span class="sourceLineNo">807</span>   * @param confName conf key to read from the configuration<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   * @return a map of column family to the given configuration value<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      Configuration conf, String confName) {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    String confVal = conf.get(confName, "");<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      String[] familySplit = familyConf.split("=");<a name="line.815"></a>
+<span class="sourceLineNo">816</span>      if (familySplit.length != 2) {<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        continue;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      }<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      } catch (UnsupportedEncodingException e) {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        // will not happen with UTF-8 encoding<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        throw new AssertionError(e);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    return confValMap;<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  }<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>  /**<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   */<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.834"></a>
+<span class="sourceLineNo">835</span>          writeMultipleTables)<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      throws IOException {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    Configuration conf = job.getConfiguration();<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    // create the partitions file<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    FileSystem fs = FileSystem.get(conf);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    String hbaseTmpFsDir =<a name="line.840"></a>
+<span class="sourceLineNo">841</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    fs.makeQualified(partitionsPath);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    fs.deleteOnExit(partitionsPath);<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    // configure job to use it<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.853"></a>
+<span class="sourceLineNo">854</span>  @VisibleForTesting<a name="line.854"></a>
+<span class="sourceLineNo">855</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      throws UnsupportedEncodingException {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    int i = 0;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      if (tableDescriptor == null) {<a name="line.860"></a>
+<span class="sourceLineNo">861</span>        // could happen with mock table instance<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        return "";<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      }<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>        if (i++ &gt; 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>          attributeValue.append('&amp;');<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        attributeValue.append(URLEncoder.encode(<a name="line.869"></a>
+<span class="sourceLineNo">870</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.870"></a>
+<span class="sourceLineNo">871</span>            "UTF-8"));<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        attributeValue.append('=');<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      }<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    // Get rid of the last ampersand<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    return attributeValue.toString();<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * Invoked while configuring the MR job for incremental load.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  @VisibleForTesting<a name="line.884"></a>
+<span class="sourceLineNo">885</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>          familyDescriptor.getCompressionType().getName();<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.889"></a>
+<span class="sourceLineNo">890</span>   * configuring the MR job for incremental load.<a name="line.890"></a>
+<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
+<span class="sourceLineNo">892</span>  @VisibleForTesting<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.893"></a>
+<span class="sourceLineNo">894</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.894"></a>
+<span class="sourceLineNo">895</span><a name="line.895"></a>
+<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * configuring the MR job for incremental load.<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   */<a name="line.899"></a>
+<span class="sourceLineNo">900</span>  @VisibleForTesting<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    if (bloomType == null) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    return bloomType;<a name="line.906"></a>
+<span class="sourceLineNo">907</span>  };<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>  /**<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   * configuring the MR job for incremental load.<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   */<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  @VisibleForTesting<a name="line.913"></a>
+<span class="sourceLineNo">914</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    String bloomParam = "";<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    }<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    return bloomParam;<a name="line.920"></a>
+<span class="sourceLineNo">921</span>  };<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>  /**<a name="line.923"></a>
+<span class="sourceLineNo">924</span>   * Serialize column family to data block encoding map to configuration.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>   * Invoked while configuring the MR job for incremental load.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>   */<a name="line.926"></a>
+<span class="sourceLineNo">927</span>  @VisibleForTesting<a name="line.927"></a>
+<span class="sourceLineNo">928</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    if (encoding == null) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      encoding = DataBlockEncoding.NONE;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    }<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    return encoding.toString();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>  };<a name="line.934"></a>
+<span class="sourceLineNo">935</span><a name="line.935"></a>
+<span class="sourceLineNo">936</span>}<a name="line.936"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index fc1a285..9c1cfea 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -822,247 +822,248 @@
 <span class="sourceLineNo">814</span>      org.apache.hadoop.hbase.mapreduce.TableMapper.class,           // hbase-server<a name="line.814"></a>
 <span class="sourceLineNo">815</span>      org.apache.hadoop.hbase.metrics.impl.FastLongHistogram.class,  // hbase-metrics<a name="line.815"></a>
 <span class="sourceLineNo">816</span>      org.apache.hadoop.hbase.metrics.Snapshot.class,                // hbase-metrics-api<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      org.apache.zookeeper.ZooKeeper.class,<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      org.apache.hbase.thirdparty.io.netty.channel.Channel.class,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      com.google.protobuf.Message.class,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.class,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      org.apache.hbase.thirdparty.com.google.common.collect.Lists.class,<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      org.apache.htrace.core.Tracer.class,<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      com.codahale.metrics.MetricRegistry.class,<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      org.apache.commons.lang3.ArrayUtils.class,<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      org.apache.hbase.thirdparty.com.google.gson.Gson.class,<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      org.apache.hadoop.hbase.zookeeper.ZKWatcher.class);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * Returns a classpath string built from the content of the "tmpjars" value in {@code conf}.<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   * Also exposed to shell scripts via `bin/hbase mapredcp`.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
-<span class="sourceLineNo">833</span>  public static String buildDependencyClasspath(Configuration conf) {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    if (conf == null) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      throw new IllegalArgumentException("Must provide a configuration object.");<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    Set&lt;String&gt; paths = new HashSet&lt;&gt;(conf.getStringCollection("tmpjars"));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    if (paths.isEmpty()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      throw new IllegalArgumentException("Configuration contains no tmpjars.");<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    StringBuilder sb = new StringBuilder();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    for (String s : paths) {<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      // entries can take the form 'file:/path/to/file.jar'.<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      int idx = s.indexOf(":");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      if (idx != -1) s = s.substring(idx + 1);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      if (sb.length() &gt; 0) sb.append(File.pathSeparator);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      sb.append(s);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    }<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return sb.toString();<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>  /**<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * Add the HBase dependency jars as well as jars for any of the configured<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * job classes to the job configuration, so that JobClient will ship them<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   * to the cluster and add them to the DistributedCache.<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   */<a name="line.856"></a>
-<span class="sourceLineNo">857</span>  public static void addDependencyJars(Job job) throws IOException {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    addHBaseDependencyJars(job.getConfiguration());<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    try {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      addDependencyJarsForClasses(job.getConfiguration(),<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          // when making changes here, consider also mapred.TableMapReduceUtil<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          // pull job classes<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          job.getMapOutputKeyClass(),<a name="line.863"></a>
-<span class="sourceLineNo">864</span>          job.getMapOutputValueClass(),<a name="line.864"></a>
-<span class="sourceLineNo">865</span>          job.getInputFormatClass(),<a name="line.865"></a>
-<span class="sourceLineNo">866</span>          job.getOutputKeyClass(),<a name="line.866"></a>
-<span class="sourceLineNo">867</span>          job.getOutputValueClass(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          job.getOutputFormatClass(),<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          job.getPartitionerClass(),<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          job.getCombinerClass());<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    } catch (ClassNotFoundException e) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      throw new IOException(e);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span>  }<a name="line.874"></a>
-<span class="sourceLineNo">875</span><a name="line.875"></a>
-<span class="sourceLineNo">876</span>  /**<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * Add the jars containing the given classes to the job's configuration<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   * the DistributedCache.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * @deprecated since 1.3.0 and will be removed in 3.0.0. Use {@link #addDependencyJars(Job)}<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   *   instead.<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   * @see #addDependencyJars(Job)<a name="line.882"></a>
-<span class="sourceLineNo">883</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-8386"&gt;HBASE-8386&lt;/a&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   */<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  @Deprecated<a name="line.885"></a>
-<span class="sourceLineNo">886</span>  public static void addDependencyJars(Configuration conf,<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    LOG.warn("The addDependencyJars(Configuration, Class&lt;?&gt;...) method has been deprecated since it"<a name="line.888"></a>
-<span class="sourceLineNo">889</span>             + " is easy to use incorrectly. Most users should rely on addDependencyJars(Job) " +<a name="line.889"></a>
-<span class="sourceLineNo">890</span>             "instead. See HBASE-8386 for more details.");<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    addDependencyJarsForClasses(conf, classes);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  }<a name="line.892"></a>
-<span class="sourceLineNo">893</span><a name="line.893"></a>
-<span class="sourceLineNo">894</span>  /**<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   * Add the jars containing the given classes to the job's configuration<a name="line.895"></a>
-<span class="sourceLineNo">896</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.896"></a>
-<span class="sourceLineNo">897</span>   * the DistributedCache.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>   *<a name="line.898"></a>
-<span class="sourceLineNo">899</span>   * N.B. that this method at most adds one jar per class given. If there is more than one<a name="line.899"></a>
-<span class="sourceLineNo">900</span>   * jar available containing a class with the same name as a given class, we don't define<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * which of those jars might be chosen.<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   *<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   * @param conf The Hadoop Configuration to modify<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * @param classes will add just those dependencies needed to find the given classes<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @throws IOException if an underlying library call fails.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  @InterfaceAudience.Private<a name="line.907"></a>
-<span class="sourceLineNo">908</span>  public static void addDependencyJarsForClasses(Configuration conf,<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    FileSystem localFs = FileSystem.getLocal(conf);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    Set&lt;String&gt; jars = new HashSet&lt;&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // Add jars that are already in the tmpjars variable<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    jars.addAll(conf.getStringCollection("tmpjars"));<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    // add jars as we find them to a map of contents jar name so that we can avoid<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    // creating new jars for classes that have already been packaged.<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    Map&lt;String, String&gt; packagedClasses = new HashMap&lt;&gt;();<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>    // Add jars containing the specified classes<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    for (Class&lt;?&gt; clazz : classes) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      if (clazz == null) continue;<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      Path path = findOrCreateJar(clazz, localFs, packagedClasses);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (path == null) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        LOG.warn("Could not find jar for class " + clazz +<a name="line.926"></a>
-<span class="sourceLineNo">927</span>                 " in order to ship it to the cluster.");<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        continue;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      if (!localFs.exists(path)) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>        LOG.warn("Could not validate jar file " + path + " for class "<a name="line.931"></a>
-<span class="sourceLineNo">932</span>                 + clazz);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        continue;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      jars.add(path.toString());<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    if (jars.isEmpty()) return;<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>    conf.set("tmpjars", StringUtils.arrayToString(jars.toArray(new String[jars.size()])));<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>  /**<a name="line.942"></a>
-<span class="sourceLineNo">943</span>   * Finds the Jar for a class or creates it if it doesn't exist. If the class is in<a name="line.943"></a>
-<span class="sourceLineNo">944</span>   * a directory in the classpath, it creates a Jar on the fly with the<a name="line.944"></a>
-<span class="sourceLineNo">945</span>   * contents of the directory and returns the path to that Jar. If a Jar is<a name="line.945"></a>
-<span class="sourceLineNo">946</span>   * created, it is created in the system temporary directory. Otherwise,<a name="line.946"></a>
-<span class="sourceLineNo">947</span>   * returns an existing jar that contains a class of the same name. Maintains<a name="line.947"></a>
-<span class="sourceLineNo">948</span>   * a mapping from jar contents to the tmp jar created.<a name="line.948"></a>
-<span class="sourceLineNo">949</span>   * @param my_class the class to find.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>   * @param fs the FileSystem with which to qualify the returned path.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>   * @param packagedClasses a map of class name to path.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>   * @return a jar file that contains the class.<a name="line.952"></a>
-<span class="sourceLineNo">953</span>   * @throws IOException<a name="line.953"></a>
-<span class="sourceLineNo">954</span>   */<a name="line.954"></a>
-<span class="sourceLineNo">955</span>  private static Path findOrCreateJar(Class&lt;?&gt; my_class, FileSystem fs,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      Map&lt;String, String&gt; packagedClasses)<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  throws IOException {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // attempt to locate an existing jar for the class.<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    String jar = findContainingJar(my_class, packagedClasses);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (null == jar || jar.isEmpty()) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      jar = getJar(my_class);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      updateMap(jar, packagedClasses);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    }<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>    if (null == jar || jar.isEmpty()) {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>    LOG.debug(String.format("For class %s, using jar %s", my_class.getName(), jar));<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    return new Path(jar).makeQualified(fs.getUri(), fs.getWorkingDirectory());<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  /**<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * Add entries to &lt;code&gt;packagedClasses&lt;/code&gt; corresponding to class files<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * contained in &lt;code&gt;jar&lt;/code&gt;.<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param jar The jar who's content to list.<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param packagedClasses map[class -&gt; jar]<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
-<span class="sourceLineNo">979</span>  private static void updateMap(String jar, Map&lt;String, String&gt; packagedClasses) throws IOException {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    if (null == jar || jar.isEmpty()) {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      return;<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    }<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    ZipFile zip = null;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    try {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      zip = new ZipFile(jar);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (Enumeration&lt;? extends ZipEntry&gt; iter = zip.entries(); iter.hasMoreElements();) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        ZipEntry entry = iter.nextElement();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        if (entry.getName().endsWith("class")) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          packagedClasses.put(entry.getName(), jar);<a name="line.989"></a>
-<span class="sourceLineNo">990</span>        }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      if (null != zip) zip.close();<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  /**<a name="line.997"></a>
-<span class="sourceLineNo">998</span>   * Find a jar that contains a class of the same name, if any. It will return<a name="line.998"></a>
-<span class="sourceLineNo">999</span>   * a jar file, even if that is not the first thing on the class path that<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>   * has a class with the same name. Looks first on the classpath and then in<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * the &lt;code&gt;packagedClasses&lt;/code&gt; map.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * @param my_class the class to find.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @return a jar file that contains the class, or null.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @throws IOException<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  private static String findContainingJar(Class&lt;?&gt; my_class, Map&lt;String, String&gt; packagedClasses)<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      throws IOException {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    ClassLoader loader = my_class.getClassLoader();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    String class_file = my_class.getName().replaceAll("\\.", "/") + ".class";<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    if (loader != null) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      // first search the classpath<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      for (Enumeration&lt;URL&gt; itr = loader.getResources(class_file); itr.hasMoreElements();) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        URL url = itr.nextElement();<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        if ("jar".equals(url.getProtocol())) {<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          String toReturn = url.getPath();<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          if (toReturn.startsWith("file:")) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>            toReturn = toReturn.substring("file:".length());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          // URLDecoder is a misnamed class, since it actually decodes<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>          // x-www-form-urlencoded MIME type rather than actual<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          // URL encoding (which the file path has). Therefore it would<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          // decode +s to ' 's which is incorrect (spaces are actually<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>          // either unencoded or encoded as "%20"). Replace +s first, so<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          // that they are kept sacred during the decoding process.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>          toReturn = toReturn.replaceAll("\\+", "%2B");<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>          toReturn = URLDecoder.decode(toReturn, "UTF-8");<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          return toReturn.replaceAll("!.*$", "");<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>        }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    // now look in any jars we've packaged using JarFinder. Returns null when<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    // no jar is found.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    return packagedClasses.get(class_file);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>  /**<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   * Invoke 'getJar' on a custom JarFinder implementation. Useful for some job<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * configuration contexts (HBASE-8140) and also for testing on MRv2.<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * check if we have HADOOP-9426.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @param my_class the class to find.<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   * @return a jar file that contains the class, or null.<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>   */<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>  private static String getJar(Class&lt;?&gt; my_class) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    String ret = null;<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    try {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      ret = JarFinder.getJar(my_class);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    } catch (Exception e) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>      // toss all other exceptions, related to reflection failure<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      throw new RuntimeException("getJar invocation failed.", e);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    return ret;<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>  }<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>}<a name="line.1057"></a>
+<span class="sourceLineNo">817</span>      org.apache.hbase.thirdparty.com.google.gson.GsonBuilder.class, // hbase-shaded-gson<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      org.apache.zookeeper.ZooKeeper.class,<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      org.apache.hbase.thirdparty.io.netty.channel.Channel.class,<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      com.google.protobuf.Message.class,<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.class,<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      org.apache.hbase.thirdparty.com.google.common.collect.Lists.class,<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      org.apache.htrace.core.Tracer.class,<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      com.codahale.metrics.MetricRegistry.class,<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      org.apache.commons.lang3.ArrayUtils.class,<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      org.apache.hbase.thirdparty.com.google.gson.Gson.class,<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      org.apache.hadoop.hbase.zookeeper.ZKWatcher.class);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  }<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>  /**<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * Returns a classpath string built from the content of the "tmpjars" value in {@code conf}.<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Also exposed to shell scripts via `bin/hbase mapredcp`.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   */<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  public static String buildDependencyClasspath(Configuration conf) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    if (conf == null) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      throw new IllegalArgumentException("Must provide a configuration object.");<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    Set&lt;String&gt; paths = new HashSet&lt;&gt;(conf.getStringCollection("tmpjars"));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    if (paths.isEmpty()) {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      throw new IllegalArgumentException("Configuration contains no tmpjars.");<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    StringBuilder sb = new StringBuilder();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    for (String s : paths) {<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      // entries can take the form 'file:/path/to/file.jar'.<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      int idx = s.indexOf(":");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>      if (idx != -1) s = s.substring(idx + 1);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      if (sb.length() &gt; 0) sb.append(File.pathSeparator);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      sb.append(s);<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    return sb.toString();<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Add the HBase dependency jars as well as jars for any of the configured<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * job classes to the job configuration, so that JobClient will ship them<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * to the cluster and add them to the DistributedCache.<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   */<a name="line.857"></a>
+<span class="sourceLineNo">858</span>  public static void addDependencyJars(Job job) throws IOException {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    addHBaseDependencyJars(job.getConfiguration());<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    try {<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      addDependencyJarsForClasses(job.getConfiguration(),<a name="line.861"></a>
+<span class="sourceLineNo">862</span>          // when making changes here, consider also mapred.TableMapReduceUtil<a name="line.862"></a>
+<span class="sourceLineNo">863</span>          // pull job classes<a name="line.863"></a>
+<span class="sourceLineNo">864</span>          job.getMapOutputKeyClass(),<a name="line.864"></a>
+<span class="sourceLineNo">865</span>          job.getMapOutputValueClass(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>          job.getInputFormatClass(),<a name="line.866"></a>
+<span class="sourceLineNo">867</span>          job.getOutputKeyClass(),<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          job.getOutputValueClass(),<a name="line.868"></a>
+<span class="sourceLineNo">869</span>          job.getOutputFormatClass(),<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          job.getPartitionerClass(),<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          job.getCombinerClass());<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    } catch (ClassNotFoundException e) {<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      throw new IOException(e);<a name="line.873"></a>
+<span class="sourceLineNo">874</span>    }<a name="line.874"></a>
+<span class="sourceLineNo">875</span>  }<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>  /**<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * Add the jars containing the given classes to the job's configuration<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * the DistributedCache.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * @deprecated since 1.3.0 and will be removed in 3.0.0. Use {@link #addDependencyJars(Job)}<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   *   instead.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   * @see #addDependencyJars(Job)<a name="line.883"></a>
+<span class="sourceLineNo">884</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-8386"&gt;HBASE-8386&lt;/a&gt;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>   */<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  @Deprecated<a name="line.886"></a>
+<span class="sourceLineNo">887</span>  public static void addDependencyJars(Configuration conf,<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    LOG.warn("The addDependencyJars(Configuration, Class&lt;?&gt;...) method has been deprecated since it"<a name="line.889"></a>
+<span class="sourceLineNo">890</span>             + " is easy to use incorrectly. Most users should rely on addDependencyJars(Job) " +<a name="line.890"></a>
+<span class="sourceLineNo">891</span>             "instead. See HBASE-8386 for more details.");<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    addDependencyJarsForClasses(conf, classes);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  }<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>  /**<a name="line.895"></a>
+<span class="sourceLineNo">896</span>   * Add the jars containing the given classes to the job's configuration<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * the DistributedCache.<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   *<a name="line.899"></a>
+<span class="sourceLineNo">900</span>   * N.B. that this method at most adds one jar per class given. If there is more than one<a name="line.900"></a>
+<span class="sourceLineNo">901</span>   * jar available containing a class with the same name as a given class, we don't define<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * which of those jars might be chosen.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   *<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   * @param conf The Hadoop Configuration to modify<a name="line.904"></a>
+<span class="sourceLineNo">905</span>   * @param classes will add just those dependencies needed to find the given classes<a name="line.905"></a>
+<span class="sourceLineNo">906</span>   * @throws IOException if an underlying library call fails.<a name="line.906"></a>
+<span class="sourceLineNo">907</span>   */<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  @InterfaceAudience.Private<a name="line.908"></a>
+<span class="sourceLineNo">909</span>  public static void addDependencyJarsForClasses(Configuration conf,<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.910"></a>
+<span class="sourceLineNo">911</span><a name="line.911"></a>
+<span class="sourceLineNo">912</span>    FileSystem localFs = FileSystem.getLocal(conf);<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    Set&lt;String&gt; jars = new HashSet&lt;&gt;();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    // Add jars that are already in the tmpjars variable<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    jars.addAll(conf.getStringCollection("tmpjars"));<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    // add jars as we find them to a map of contents jar name so that we can avoid<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    // creating new jars for classes that have already been packaged.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    Map&lt;String, String&gt; packagedClasses = new HashMap&lt;&gt;();<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>    // Add jars containing the specified classes<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    for (Class&lt;?&gt; clazz : classes) {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      if (clazz == null) continue;<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      Path path = findOrCreateJar(clazz, localFs, packagedClasses);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (path == null) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        LOG.warn("Could not find jar for class " + clazz +<a name="line.927"></a>
+<span class="sourceLineNo">928</span>                 " in order to ship it to the cluster.");<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        continue;<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (!localFs.exists(path)) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        LOG.warn("Could not validate jar file " + path + " for class "<a name="line.932"></a>
+<span class="sourceLineNo">933</span>                 + clazz);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>        continue;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      jars.add(path.toString());<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    }<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    if (jars.isEmpty()) return;<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>    conf.set("tmpjars", StringUtils.arrayToString(jars.toArray(new String[jars.size()])));<a name="line.940"></a>
+<span class="sourceLineNo">941</span>  }<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>  /**<a name="line.943"></a>
+<span class="sourceLineNo">944</span>   * Finds the Jar for a class or creates it if it doesn't exist. If the class is in<a name="line.944"></a>
+<span class="sourceLineNo">945</span>   * a directory in the classpath, it creates a Jar on the fly with the<a name="line.945"></a>
+<span class="sourceLineNo">946</span>   * contents of the directory and returns the path to that Jar. If a Jar is<a name="line.946"></a>
+<span class="sourceLineNo">947</span>   * created, it is created in the system temporary directory. Otherwise,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>   * returns an existing jar that contains a class of the same name. Maintains<a name="line.948"></a>
+<span class="sourceLineNo">949</span>   * a mapping from jar contents to the tmp jar created.<a name="line.949"></a>
+<span class="sourceLineNo">950</span>   * @param my_class the class to find.<a name="line.950"></a>
+<span class="sourceLineNo">951</span>   * @param fs the FileSystem with which to qualify the returned path.<a name="line.951"></a>
+<span class="sourceLineNo">952</span>   * @param packagedClasses a map of class name to path.<a name="line.952"></a>
+<span class="sourceLineNo">953</span>   * @return a jar file that contains the class.<a name="line.953"></a>
+<span class="sourceLineNo">954</span>   * @throws IOException<a name="line.954"></a>
+<span class="sourceLineNo">955</span>   */<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  private static Path findOrCreateJar(Class&lt;?&gt; my_class, FileSystem fs,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>      Map&lt;String, String&gt; packagedClasses)<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  throws IOException {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>    // attempt to locate an existing jar for the class.<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    String jar = findContainingJar(my_class, packagedClasses);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    if (null == jar || jar.isEmpty()) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      jar = getJar(my_class);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      updateMap(jar, packagedClasses);<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>    if (null == jar || jar.isEmpty()) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      return null;<a name="line.967"></a>
+<span class="sourceLineNo">968</span>    }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>    LOG.debug(String.format("For class %s, using jar %s", my_class.getName(), jar));<a name="line.970"></a>
+<span class="sourceLineNo">971</span>    return new Path(jar).makeQualified(fs.getUri(), fs.getWorkingDirectory());<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  }<a name="line.972"></a>
+<span class="sourceLineNo">973</span><a name="line.973"></a>
+<span class="sourceLineNo">974</span>  /**<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * Add entries to &lt;code&gt;packagedClasses&lt;/code&gt; corresponding to class files<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * contained in &lt;code&gt;jar&lt;/code&gt;.<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param jar The jar who's content to list.<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * @param packagedClasses map[class -&gt; jar]<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  private static void updateMap(String jar, Map&lt;String, String&gt; packagedClasses) throws IOException {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (null == jar || jar.isEmpty()) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span>    ZipFile zip = null;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>    try {<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      zip = new ZipFile(jar);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      for (Enumeration&lt;? extends ZipEntry&gt; iter = zip.entries(); iter.hasMoreElements();) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        ZipEntry entry = iter.nextElement();<a name="line.988"></a>
+<span class="sourceLineNo">989</span>        if (entry.getName().endsWith("class")) {<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          packagedClasses.put(entry.getName(), jar);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    } finally {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>      if (null != zip) zip.close();<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
+<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">998</span>  /**<a name="line.998"></a>
+<span class="sourceLineNo">999</span>   * Find a jar that contains a class of the same name, if any. It will return<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * a jar file, even if that is not the first thing on the class path that<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * has a class with the same name. Looks first on the classpath and then in<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * the &lt;code&gt;packagedClasses&lt;/code&gt; map.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @param my_class the class to find.<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   * @return a jar file that contains the class, or null.<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>   * @throws IOException<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>   */<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  private static String findContainingJar(Class&lt;?&gt; my_class, Map&lt;String, String&gt; packagedClasses)<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      throws IOException {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    ClassLoader loader = my_class.getClassLoader();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    String class_file = my_class.getName().replaceAll("\\.", "/") + ".class";<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (loader != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      // first search the classpath<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      for (Enumeration&lt;URL&gt; itr = loader.getResources(class_file); itr.hasMoreElements();) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        URL url = itr.nextElement();<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        if ("jar".equals(url.getProtocol())) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>          String toReturn = url.getPath();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>          if (toReturn.startsWith("file:")) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>            toReturn = toReturn.substring("file:".length());<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>          }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          // URLDecoder is a misnamed class, since it actually decodes<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>          // x-www-form-urlencoded MIME type rather than actual<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>          // URL encoding (which the file path has). Therefore it would<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          // decode +s to ' 's which is incorrect (spaces are actually<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          // either unencoded or encoded as "%20"). Replace +s first, so<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          // that they are kept sacred during the decoding process.<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          toReturn = toReturn.replaceAll("\\+", "%2B");<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          toReturn = URLDecoder.decode(toReturn, "UTF-8");<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          return toReturn.replaceAll("!.*$", "");<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>        }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      }<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span><a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    // now look in any jars we've packaged using JarFinder. Returns null when<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    // no jar is found.<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    return packagedClasses.get(class_file);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>  /**<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>   * Invoke 'getJar' on a custom JarFinder implementation. Useful for some job<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>   * configuration contexts (HBASE-8140) and also for testing on MRv2.<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>   * check if we have HADOOP-9426.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>   * @param my_class the class to find.<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * @return a jar file that contains the class, or null.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   */<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>  private static String getJar(Class&lt;?&gt; my_class) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>    String ret = null;<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    try {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>      ret = JarFinder.getJar(my_class);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    } catch (Exception e) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      // toss all other exceptions, related to reflection failure<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>      throw new RuntimeException("getJar invocation failed.", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    return ret;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  }<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>}<a name="line.1058"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/util/VersionInfo.html b/apidocs/src-html/org/apache/hadoop/hbase/util/VersionInfo.html
index 52b2865..10f9def 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/util/VersionInfo.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/util/VersionInfo.html
@@ -174,10 +174,14 @@
 <span class="sourceLineNo">166</span>    return comps;<a name="line.166"></a>
 <span class="sourceLineNo">167</span>  }<a name="line.167"></a>
 <span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public static void main(String[] args) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    writeTo(System.out);<a name="line.170"></a>
+<span class="sourceLineNo">169</span>  public static int getMajorVersion(String version) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    return Integer.parseInt(version.split("\\.")[0]);<a name="line.170"></a>
 <span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span>}<a name="line.172"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public static void main(String[] args) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    writeTo(System.out);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>}<a name="line.176"></a>
 
 
 
diff --git a/book.html b/book.html
index 07eeaef..1efbcbe 100644
--- a/book.html
+++ b/book.html
@@ -43835,7 +43835,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-10-08 14:29:57 UTC
+Last updated 2019-10-09 14:31:09 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index 938dde4..200736d 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -148,7 +148,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 68983e4..02f977d 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -41759,7 +41759,7 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
-<td>Method length is 284 lines (max allowed is 150).</td>
+<td>Method length is 280 lines (max allowed is 150).</td>
 <td>182</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -41772,97 +41772,97 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>431</td></tr>
+<td>427</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
-<td>461</td></tr>
+<td>457</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 5 should be on the previous line.</td>
-<td>502</td></tr>
+<td>498</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 9 should be on the previous line.</td>
-<td>509</td></tr>
+<td>505</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
-<td>515</td></tr>
+<td>511</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
-<td>543</td></tr>
+<td>539</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>646</td></tr>
+<td>642</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>647</td></tr>
+<td>643</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>649</td></tr>
+<td>645</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>649</td></tr>
+<td>645</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 5 should be on the previous line.</td>
-<td>650</td></tr>
+<td>646</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 146).</td>
-<td>658</td></tr>
+<td>654</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>661</td></tr>
+<td>657</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>857</td></tr>
+<td>853</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
-<td>859</td></tr>
+<td>855</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
-<td>874</td></tr></table></div>
+<td>870</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.HRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
@@ -43389,55 +43389,55 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>845</td></tr>
+<td>846</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>846</td></tr>
+<td>847</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>922</td></tr>
+<td>923</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>937</td></tr>
+<td>938</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>953</td></tr>
+<td>954</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>957</td></tr>
+<td>958</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>979</td></tr>
+<td>980</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>993</td></tr>
+<td>994</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1004</td></tr></table></div>
+<td>1005</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableMapper.java">org/apache/hadoop/hbase/mapreduce/TableMapper.java</h3>
 <table border="0" class="table table-striped">
@@ -43965,181 +43965,181 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>509</td></tr>
+<td>530</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 has incorrect indentation level 6, expected level should be 4.</td>
-<td>587</td></tr>
+<td>608</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
-<td>596</td></tr>
+<td>617</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 170 lines (max allowed is 150).</td>
-<td>599</td></tr>
+<td>620</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>760</td></tr>
+<td>781</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>762</td></tr>
+<td>783</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
-<td>771</td></tr>
+<td>792</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>807</td></tr>
+<td>828</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
-<td>819</td></tr>
+<td>840</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>854</td></tr>
+<td>875</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>878</td></tr>
+<td>899</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getMockColumnFamiliesForBloomType' has incorrect indentation level 2, expected level should be 4.</td>
-<td>927</td></tr>
+<td>948</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>927</td></tr>
+<td>948</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>948</td></tr>
+<td>969</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
-<td>961</td></tr>
+<td>982</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rparen' has incorrect indentation level 10, expected level should be 6.</td>
-<td>973</td></tr>
+<td>994</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getMockColumnFamiliesForBlockSize' has incorrect indentation level 2, expected level should be 4.</td>
-<td>999</td></tr>
+<td>1020</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>999</td></tr>
+<td>1020</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1024</td></tr>
+<td>1045</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
-<td>1038</td></tr>
+<td>1059</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>1075</td></tr>
+<td>1096</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1097</td></tr>
+<td>1118</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1173</td></tr>
+<td>1194</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>1178</td></tr>
+<td>1199</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>1192</td></tr>
+<td>1213</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>1194</td></tr>
+<td>1215</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>1394</td></tr>
+<td>1415</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>1398</td></tr>
+<td>1419</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>1447</td></tr>
+<td>1468</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>1449</td></tr></table></div>
+<td>1470</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestHRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
@@ -49107,13 +49107,13 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2021</td></tr>
+<td>2033</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
-<td>2069</td></tr></table></div>
+<td>2090</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.GCMergedRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/GCMergedRegionsProcedure.java</h3>
 <table border="0" class="table table-striped">
@@ -92796,7 +92796,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/coc.html b/coc.html
index c2d9196..9745ab2 100644
--- a/coc.html
+++ b/coc.html
@@ -217,7 +217,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index 86ae05d..5bcf316 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -289,7 +289,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 24860b8..3545dcb 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -534,7 +534,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index caf5f73..9e242a9 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -170,7 +170,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index 70a5b3b..fcb1946 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -892,7 +892,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-08</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-10-09</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 2ccf91e..bcb16b5 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3999,14 +3999,14 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Tue Oct  8 14:35:01 UTC 2019"</code></td>
+<td class="colLast"><code>"Wed Oct  9 14:39:28 UTC 2019"</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>"e911bb7e21a2dad6f2e595868914533ae731d0da"</code></td>
+<td class="colLast"><code>"fdac2ddc81c785d9e6d44465d8d4893c15fdab72"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
@@ -4029,13 +4029,6 @@
 <td><code><a href="org/apache/hadoop/hbase/Version.html#user">user</a></code></td>
 <td class="colLast"><code>"jenkins"</code></td>
 </tr>
-<tr class="rowColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.Version.version">
-<!--   -->
-</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#version">version</a></code></td>
-<td class="colLast"><code>"3.0.0-SNAPSHOT"</code></td>
-</tr>
 </tbody>
 </table>
 </li>
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 1c47be0..0b66c3c 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -17632,6 +17632,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/TinyLfuBlockCache.html#containsBlock-org.apache.hadoop.hbase.io.hfile.BlockCacheKey-">containsBlock(BlockCacheKey)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/TinyLfuBlockCache.html" title="class in org.apache.hadoop.hbase.io.hfile">TinyLfuBlockCache</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#containsBogusAssignments-java.util.Map-java.util.List-">containsBogusAssignments(Map&lt;RegionInfo, RegionStateNode&gt;, List&lt;RegionInfo&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Result.html#containsColumn-byte:A-byte:A-">containsColumn(byte[], byte[])</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a></dt>
 <dd>
 <div class="block">Checks for existence of a value for the specified column (empty or not).</div>
@@ -42913,6 +42915,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.html#getMajorVersion--">getMajorVersion()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileWriterImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/VersionInfo.html#getMajorVersion-java.lang.String-">getMajorVersion(String)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/VersionInfo.html" title="class in org.apache.hadoop.hbase.util">VersionInfo</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html#getManager--">getManager()</a></span> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.html" title="class in org.apache.hadoop.hbase.quotas">SpaceQuotaRefresherChore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/HBackupFileSystem.html#getManifest-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.Path-java.lang.String-">getManifest(Configuration, Path, String)</a></span> - Static method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/HBackupFileSystem.html" title="class in org.apache.hadoop.hbase.backup">HBackupFileSystem</a></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/Version.html b/devapidocs/org/apache/hadoop/hbase/Version.html
index 8d56cd7..28e5633 100644
--- a/devapidocs/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/org/apache/hadoop/hbase/Version.html
@@ -104,7 +104,7 @@
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.9">Version</a>
+public class <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.11">Version</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -201,11 +201,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>version</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.10">version</a></pre>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.Version.version">Constant Field Values</a></dd>
-</dl>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.12">version</a></pre>
 </li>
 </ul>
 <a name="revision">
@@ -214,7 +210,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>revision</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.11">revision</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.13">revision</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.Version.revision">Constant Field Values</a></dd>
@@ -227,7 +223,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>user</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.12">user</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.14">user</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.Version.user">Constant Field Values</a></dd>
@@ -240,7 +236,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>date</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.13">date</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.15">date</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.Version.date">Constant Field Values</a></dd>
@@ -253,7 +249,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>url</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.14">url</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.16">url</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.Version.url">Constant Field Values</a></dd>
@@ -266,7 +262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>srcChecksum</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.15">srcChecksum</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.17">srcChecksum</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.Version.srcChecksum">Constant Field Values</a></dd>
@@ -287,7 +283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Version</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.9">Version</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.11">Version</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 0e95f19..6b6a01e 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,9 +167,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
index bec53d3..0a8f329 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/RegionInfo.html
@@ -3431,6 +3431,16 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;pendingRegions)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#containsBogusAssignments-java.util.Map-java.util.List-">containsBogusAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/Reg [...]
+                        <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hirs)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#containsBogusAssignments-java.util.Map-java.util.List-">containsBogusAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/Reg [...]
+                        <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hirs)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[]</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createAssignProcedures-java.util.List-">createAssignProcedures</a></span>(<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/client/RegionInfo.html" ti [...]
 <div class="block">Create an array of TransitRegionStateProcedure w/o specifying a target server.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 9f2a545..4b2833c 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -426,21 +426,21 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index c51f7b2..dc618a4 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -201,8 +201,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index 531254c..127caa7 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index d4cc699..8d38b2f 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -189,13 +189,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
index 30d5e24..fe725db 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -138,9 +138,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index aff4b60..375ee78 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -300,9 +300,9 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index cb4ea86..d288952 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,8 +353,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html
index 897ba73..b02f674 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.487">HFileOutputFormat2.WriterLength</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.483">HFileOutputFormat2.WriterLength</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -188,7 +188,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>written</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html#line.488">written</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html#line.484">written</a></pre>
 </li>
 </ul>
 <a name="writer">
@@ -197,7 +197,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writer</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html#line.489">writer</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html#line.485">writer</a></pre>
 </li>
 </ul>
 </li>
@@ -214,7 +214,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WriterLength</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html#line.487">WriterLength</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html#line.483">WriterLength</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
index dab56ce..eb16879 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
@@ -666,7 +666,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>compressionDetails</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
 <div class="block">Serialize column family to compression algorithm map to configuration.
  Invoked while configuring the MR job for incremental load.</div>
 </li>
@@ -677,7 +677,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>blockSizeDetails</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
 <div class="block">Serialize column family to block size map to configuration. Invoked while
  configuring the MR job for incremental load.</div>
 </li>
@@ -688,7 +688,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>bloomTypeDetails</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
 <div class="block">Serialize column family to bloom type map to configuration. Invoked while
  configuring the MR job for incremental load.</div>
 </li>
@@ -699,7 +699,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>bloomParamDetails</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
 <div class="block">Serialize column family to bloom param map to configuration. Invoked while
  configuring the MR job for incremental load.</div>
 </li>
@@ -710,7 +710,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>dataBlockEncodingDetails</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</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>&gt; [...]
 <div class="block">Serialize column family to data block encoding map to configuration.
  Invoked while configuring the MR job for incremental load.</div>
 </li>
@@ -799,7 +799,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureStoragePolicy</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.472">configureStoragePolicy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.468">configureStoragePolicy</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                    org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                    byte[]&nbsp;tableAndFamily,
                                    org.apache.hadoop.fs.Path&nbsp;cfPath)</pre>
@@ -812,7 +812,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStartKeys</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.496">getRegionStartKeys</a>(<a href="https://docs.oracle.com/javase/8/ [...]
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.492">getRegionStartKeys</a>(<a href="https://docs.oracle.com/javase/8/ [...]
                                                                boolean&nbsp;writeMultipleTables)
                                                         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">Return the start keys of all of the regions in this table,
@@ -829,7 +829,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>writePartitions</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.528">writePartitions</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.524">writePartitions</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                     org.apache.hadoop.fs.Path&nbsp;partitionsPath,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&gt;&nbsp;startKeys,
                                     boolean&nbsp;writeMultipleTables)
@@ -848,7 +848,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoad</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.581">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.577">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;table,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a>&nbsp;regionLocator)
                                      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>
@@ -876,7 +876,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoad</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.600">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.596">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a>&nbsp;regionLocator)
                                      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>
@@ -904,7 +904,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoad</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.607">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.603">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                      <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/mapreduce/HFileOutputFormat2.TableInfo.html" title="class in org.apache.hadoop.hbase.mapreduce">HFileOutputFormat2.TableInfo</a>&gt;&nbsp;multiTableInfo,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends org.apache.hadoop.mapreduce.OutputFormat&lt;?,?&gt;&gt;&nbsp;cls)
                               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>
@@ -920,7 +920,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoadMap</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.686">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.682">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                                <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor)
                                         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>
@@ -935,7 +935,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>createFamilyCompressionMap</h4>
-<pre>static&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;byte[],<a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.723">createFamilyCompressionMap</a>(org.apache.hadoop.conf [...]
+<pre>static&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;byte[],<a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.719">createFamilyCompressionMap</a>(org.apache.hadoop.conf [...]
 <div class="block">Runs inside the task to deserialize column family to compression algorithm
  map from the configuration.</div>
 <dl>
@@ -952,7 +952,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>createFamilyBloomTypeMap</h4>
-<pre>static&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;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver">BloomType</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.743">createFamilyBloomTypeMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&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;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver">BloomType</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.739">createFamilyBloomTypeMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Runs inside the task to deserialize column family to bloom filter type
  map from the configuration.</div>
 <dl>
@@ -969,7 +969,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>createFamilyBloomParamMap</h4>
-<pre>static&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;byte[],<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>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.762">createFamilyBloomParamMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&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;byte[],<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>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.758">createFamilyBloomParamMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Runs inside the task to deserialize column family to bloom filter param
  map from the configuration.</div>
 <dl>
@@ -986,7 +986,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>createFamilyBlockSizeMap</h4>
-<pre>static&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;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.775">createFamilyBlockSizeMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&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;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.771">createFamilyBlockSizeMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Runs inside the task to deserialize column family to block size
  map from the configuration.</div>
 <dl>
@@ -1003,7 +1003,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>createFamilyDataBlockEncodingMap</h4>
-<pre>static&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;byte[],<a href="../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.795">createFamilyDataBlockEncodingMap</a>(org.apache.hadoop.conf.C [...]
+<pre>static&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;byte[],<a href="../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.791">createFamilyDataBlockEncodingMap</a>(org.apache.hadoop.conf.C [...]
 <div class="block">Runs inside the task to deserialize column family to data block encoding
  type map from the configuration.</div>
 <dl>
@@ -1021,7 +1021,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>createFamilyConfValueMap</h4>
-<pre>private static&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;byte[],<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>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.814">createFamilyConfValueMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&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;byte[],<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>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.810">createFamilyConfValueMap</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;confName)</pre>
 <div class="block">Run inside the task to deserialize column family to given conf value map.</div>
 <dl>
@@ -1039,7 +1039,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configurePartitioner</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.838">configurePartitioner</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.834">configurePartitioner</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>&gt;&nbsp;splitPoints,
                                  boolean&nbsp;writeMultipleTables)
                           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>
@@ -1057,7 +1057,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>serializeColumnFamilyAttribute</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.859">serializeColumnFamilyAttribute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../o [...]
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.855">serializeColumnFamilyAttribute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../o [...]
                                              <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/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&gt;&nbsp;allTables)
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</a></pre>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index 6741a6f..327126f 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -1360,7 +1360,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>buildDependencyClasspath</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.833">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.834">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns a classpath string built from the content of the "tmpjars" value in <code>conf</code>.
  Also exposed to shell scripts via `bin/hbase mapredcp`.</div>
 </li>
@@ -1371,7 +1371,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>addDependencyJars</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.857">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.858">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
                               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">Add the HBase dependency jars as well as jars for any of the configured
  job classes to the job configuration, so that JobClient will ship them
@@ -1389,7 +1389,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <li class="blockList">
 <h4>addDependencyJars</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.886">addDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.887">addDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;...&nbsp;classes)
                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 1.3.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#addDependencyJars-org.apache.hadoop.mapreduce.Job-"><code>addDependencyJars(Job)</code></a>
@@ -1413,7 +1413,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <li class="blockList">
 <h4>addDependencyJarsForClasses</h4>
 <pre>@InterfaceAudience.Private
-public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.908">addDependencyJarsForClasses</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.909">addDependencyJarsForClasses</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;...&nbsp;classes)
                                                                    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">Add the jars containing the given classes to the job's configuration
@@ -1438,7 +1438,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>findOrCreateJar</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.955">findOrCreateJar</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;my_class,
+<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.956">findOrCreateJar</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;my_class,
                                                          org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                          <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/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;pac [...]
                                                   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>
@@ -1466,7 +1466,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>updateMap</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.979">updateMap</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;jar,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.980">updateMap</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;jar,
                               <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/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;packagedClasses)
                        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">Add entries to <code>packagedClasses</code> corresponding to class files
@@ -1486,7 +1486,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>findContainingJar</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.1006">findContainingJar</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;my_class,
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.1007">findContainingJar</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;my_class,
                                         <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/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;packagedClasses)
                                  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">Find a jar that contains a class of the same name, if any. It will return
@@ -1509,7 +1509,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getJar</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.1046">getJar</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;my_class)</pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.1047">getJar</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;my_class)</pre>
 <div class="block">Invoke 'getJar' on a custom JarFinder implementation. Useful for some job
  configuration contexts (HBASE-8140) and also for testing on MRv2.
  check if we have HADOOP-9426.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 16354b1..551959a 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -296,10 +296,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
index e5f22a9..835f4f6 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":9,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i [...]
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":9,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i [...]
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -426,213 +426,218 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#computeRegionInTransitionStat--">computeRegionInTransitionStat</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i10" class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#containsBogusAssignments-java.util.Map-java.util.List-">containsBogusAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.h [...]
+                        <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hirs)</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createAssignProcedure-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.ServerName-boolean-">createAssignProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                      <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer,
                      boolean&nbsp;override)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createAssignProcedures-java.util.List-">createAssignProcedures</a></span>(<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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">Reg [...]
 <div class="block">Create an array of TransitRegionStateProcedure w/o specifying a target server.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createAssignProcedures-java.util.Map-">createAssignProcedures</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href=" [...]
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MergeTableRegionsProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createMergeProcedure-org.apache.hadoop.hbase.client.RegionInfo...-">createMergeProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>...&nbsp;ris)</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createMoveRegionProcedure-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">createMoveRegionProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                          <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;targetServer)</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createOneAssignProcedure-org.apache.hadoop.hbase.client.RegionInfo-boolean-">createOneAssignProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
                         boolean&nbsp;override)</code>
 <div class="block">Create one TransitRegionStateProcedure to assign a region w/o specifying a target server.</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createOneUnassignProcedure-org.apache.hadoop.hbase.client.RegionInfo-boolean-">createOneUnassignProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
                           boolean&nbsp;override)</code>
 <div class="block">Create one TransitRegionStateProcedure to unassign a region.</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createRoundRobinAssignProcedures-java.util.List-">createRoundRobinAssignProcedures</a></span>(<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/client/RegionInfo.html" title="interface in org.apache.hado [...]
 <div class="block">Create round-robin assigns.</div>
 </td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createRoundRobinAssignProcedures-java.util.List-java.util.List-">createRoundRobinAssignProcedures</a></span>(<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/client/RegionInfo.html" title="interface in  [...]
                                 <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serversToExclude)</code>
 <div class="block">Create round-robin assigns.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">SplitTableRegionProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createSplitProcedure-org.apache.hadoop.hbase.client.RegionInfo-byte:A-">createSplitProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionToSplit,
                     byte[]&nbsp;splitKey)</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createUnassignProcedure-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">createUnassignProcedure</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                        boolean&nbsp;override)</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TransitRegionStateProcedure</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#createUnassignProceduresForDisabling-org.apache.hadoop.hbase.TableName-">createUnassignProceduresForDisabling</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Called by DisableTableProcedure to unassign all the regions for a table.</div>
 </td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#deleteTable-org.apache.hadoop.hbase.TableName-">deleteTable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Delete the region states.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code><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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getAssignedRegions--">getAssignedRegions</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getAssignMaxAttempts--">getAssignMaxAttempts</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/MetricsAssignmentManager.html" title="class in org.apache.hadoop.hbase.master">MetricsAssignmentManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getAssignmentManagerMetrics--">getAssignmentManagerMetrics</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getAssignRetryImmediatelyMaxAttempts--">getAssignRetryImmediatelyMaxAttempts</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getBalancer--">getBalancer</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getConfiguration--">getConfiguration</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code><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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getExcludedServersForSystemTable--">getExcludedServersForSystemTable</a></span>()</code>
 <div class="block">Get a list of servers that this region cannot be assigned to.</div>
 </td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code><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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">getFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getMaster--">getMaster</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getMetaAssignEvent-org.apache.hadoop.hbase.client.RegionInfo-">getMetaAssignEvent</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;metaRegionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getMetaForRegion-org.apache.hadoop.hbase.client.RegionInfo-">getMetaForRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getMetaRegionFromName-byte:A-">getMetaRegionFromName</a></span>(byte[]&nbsp;regionName)</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getMetaRegionSet--">getMetaRegionSet</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getNumRegionsOpened--">getNumRegionsOpened</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getProcedureEnvironment--">getProcedureEnvironment</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getProcedureScheduler--">getProcedureScheduler</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRegionInfo-byte:A-">getRegionInfo</a></span>(byte[]&nbsp;regionName)</code>&nbsp;</td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code><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/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRegionsInTransition--">getRegionsInTransition</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code><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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRegionsOnServer-org.apache.hadoop.hbase.ServerName-">getRegionsOnServer</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block">Returns the regions hosted by the specified server.</div>
 </td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStates</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRegionStates--">getRegionStates</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/RegionStatesCount.html" title="class in org.apache.hadoop.hbase.client">RegionStatesCount</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRegionStatesCount-org.apache.hadoop.hbase.TableName-">getRegionStatesCount</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Provide regions state count for given table.</div>
 </td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateStore.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateStore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRegionStateStore--">getRegionStateStore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getReopenStatus-org.apache.hadoop.hbase.TableName-">getReopenStatus</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Used by the client (via master) to identify if all regions have the schema updates</div>
 </td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRSReports--">getRSReports</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</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/client/Reg [...]
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getSnapShotOfAssignment-java.util.Collection-">getSnapShotOfAssignment</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hado [...]
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>private <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getSystemTables-org.apache.hadoop.hbase.ServerName-">getSystemTables</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getTableStateManager--">getTableStateManager</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#handleRegionOverStuckWarningThreshold-org.apache.hadoop.hbase.client.RegionInfo-">handleRegionOverStuckWarningThreshold</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#hasRegionsInTransition--">hasRegionsInTransition</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isCarryingMeta-org.apache.hadoop.hbase.ServerName-">isCarryingMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i54" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isCarryingRegion-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.client.RegionInfo-">isCarryingRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i55" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isMetaAssigned--">isMetaAssigned</a></span>()</code>
 <div class="block">Notice that, this only means the meta region is available on a RS, but the AM may still be
@@ -641,52 +646,52 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  executed after AM builds the region states.</div>
 </td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isMetaLoaded--">isMetaLoaded</a></span>()</code>
 <div class="block">Return whether AM finishes the meta loading, i.e, the region states rebuilding.</div>
 </td>
 </tr>
-<tr id="i56" class="altColor">
+<tr id="i57" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isMetaRegion-byte:A-">isMetaRegion</a></span>(byte[]&nbsp;regionName)</code>&nbsp;</td>
 </tr>
-<tr id="i57" class="rowColor">
+<tr id="i58" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isMetaRegion-org.apache.hadoop.hbase.client.RegionInfo-">isMetaRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i58" class="altColor">
+<tr id="i59" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isMetaRegionInTransition--">isMetaRegionInTransition</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i59" class="rowColor">
+<tr id="i60" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isRunning--">isRunning</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i60" class="altColor">
+<tr id="i61" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isTableDisabled-org.apache.hadoop.hbase.TableName-">isTableDisabled</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i61" class="rowColor">
+<tr id="i62" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#isTableEnabled-org.apache.hadoop.hbase.TableName-">isTableEnabled</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i62" class="altColor">
+<tr id="i63" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#joinCluster--">joinCluster</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i63" class="rowColor">
+<tr id="i64" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#loadMeta--">loadMeta</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i64" class="altColor">
+<tr id="i65" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#loadRegionFromMeta-java.lang.String-">loadRegionFromMeta</a></span>(<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;regionEncodedName)</code>
 <div class="block">Query META if the given <code>RegionInfo</code> exists, adding to
  <code>AssignmentManager.regionStateStore</code> cache if the region is found in META.</div>
 </td>
 </tr>
-<tr id="i65" class="rowColor">
+<tr id="i66" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#markRegionAsMerged-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.client.RegionInfo:A-">markRegionAsMerged</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;child,
                   <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
@@ -694,105 +699,105 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="block">When called here, the merge has happened.</div>
 </td>
 </tr>
-<tr id="i66" class="altColor">
+<tr id="i67" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#markRegionAsSplit-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">markRegionAsSplit</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionIn [...]
                  <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                  <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;daughterA,
                  <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;daughterB)</code>&nbsp;</td>
 </tr>
-<tr id="i67" class="rowColor">
+<tr id="i68" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#move-org.apache.hadoop.hbase.client.RegionInfo-">move</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i68" class="altColor">
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;byte[]&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#moveAsync-org.apache.hadoop.hbase.master.RegionPlan-">moveAsync</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&nbsp;regionPlan)</code>&nbsp;</td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#offlineRegion-org.apache.hadoop.hbase.client.RegionInfo-">offlineRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i70" class="altColor">
+<tr id="i71" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#onlineRegion-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.ServerName-">onlineRegion</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
             <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
-<tr id="i71" class="rowColor">
+<tr id="i72" 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/assignment/AssignmentManager.html#persistToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">persistToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i72" class="altColor">
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#preTransitCheck-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State:A-">preTransitCheck</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[]&nbsp;expectedStates)</code>&nbsp;</td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">processAssignmentPlans</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html [...]
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;retainMap,
                       <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hris,
                       <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr id="i74" class="altColor">
+<tr id="i75" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignQueue--">processAssignQueue</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i75" class="rowColor">
+<tr id="i76" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processOfflineRegions--">processOfflineRegions</a></span>()</code>
 <div class="block">Create assign procedure for offline regions.</div>
 </td>
 </tr>
-<tr id="i76" class="altColor">
+<tr id="i77" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#queueAssign-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">queueAssign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>
 <div class="block">Add the assign operation to the assignment queue.</div>
 </td>
 </tr>
-<tr id="i77" class="rowColor">
+<tr id="i78" 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/assignment/AssignmentManager.html#regionClosedAbnormally-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedAbnormally</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i78" class="altColor">
+<tr id="i79" 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/assignment/AssignmentManager.html#regionClosedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosedWithoutPersistingToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i79" class="rowColor">
+<tr id="i80" 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/assignment/AssignmentManager.html#regionClosing-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionClosing</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i80" class="altColor">
+<tr id="i81" 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/assignment/AssignmentManager.html#regionFailedOpen-org.apache.hadoop.hbase.master.assignment.RegionStateNode-boolean-">regionFailedOpen</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode,
                 boolean&nbsp;giveUp)</code>&nbsp;</td>
 </tr>
-<tr id="i81" class="rowColor">
+<tr id="i82" 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/assignment/AssignmentManager.html#regionOpenedWithoutPersistingToMeta-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpenedWithoutPersistingToMeta</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i82" class="altColor">
+<tr id="i83" 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/assignment/AssignmentManager.html#regionOpening-org.apache.hadoop.hbase.master.assignment.RegionStateNode-">regionOpening</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&nbsp;regionNode)</code>&nbsp;</td>
 </tr>
-<tr id="i83" class="rowColor">
+<tr id="i84" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportOnlineRegions-org.apache.hadoop.hbase.ServerName-java.util.Set-">reportOnlineRegions</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&nbsp;regionNames)</code>
 <div class="block">The master will call this method when the RS send the regionServerReport().</div>
 </td>
 </tr>
-<tr id="i84" class="altColor">
+<tr id="i85" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportRegionStateTransition-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest-">reportRegionStateTransition</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest&nbsp;req)</code>&nbsp;</td>
 </tr>
-<tr id="i85" class="rowColor">
+<tr id="i86" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportRegionStateTransition-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionResponse.Builder-org.apache.hadoop.hbase.ServerName-java.util.List-">reportRegionStateTransition</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRespo [...]
                            <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                            <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.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition&gt;&nbsp;transitionList)</code>&nbsp;</td>
 </tr>
-<tr id="i86" class="altColor">
+<tr id="i87" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#reportTransition-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.assignment.ServerStateNode-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-long-long-">reportTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/as [...]
                 <a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">ServerStateNode</a>&nbsp;serverNode,
@@ -800,58 +805,58 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                 long&nbsp;seqId,
                 long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i87" class="rowColor">
+<tr id="i88" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#setMetaAssigned-org.apache.hadoop.hbase.client.RegionInfo-boolean-">setMetaAssigned</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;metaRegionInfo,
                boolean&nbsp;assigned)</code>&nbsp;</td>
 </tr>
-<tr id="i88" class="altColor">
+<tr id="i89" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#setupRIT-java.util.List-">setupRIT</a></span>(<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/assignment/TransitRegionStateProcedure.html" title="class in org.apache.hadoop.hbase.master.assignme [...]
 <div class="block">Create RegionStateNode based on the TRSP list, and attach the TRSP to the RegionStateNode.</div>
 </td>
 </tr>
-<tr id="i89" class="rowColor">
+<tr id="i90" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#shouldAssignFavoredNodes-org.apache.hadoop.hbase.client.RegionInfo-">shouldAssignFavoredNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
-<tr id="i90" class="altColor">
+<tr id="i91" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#start--">start</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i91" class="rowColor">
+<tr id="i92" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#startAssignmentThread--">startAssignmentThread</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i92" class="altColor">
+<tr id="i93" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#stop--">stop</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i93" class="rowColor">
+<tr id="i94" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#stopAssignmentThread--">stopAssignmentThread</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i94" class="altColor">
+<tr id="i95" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#submitServerCrash-org.apache.hadoop.hbase.ServerName-boolean-">submitServerCrash</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                  boolean&nbsp;shouldSplitWal)</code>&nbsp;</td>
 </tr>
-<tr id="i95" class="rowColor">
+<tr id="i96" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#transitStateAndUpdate-org.apache.hadoop.hbase.master.assignment.RegionStateNode-org.apache.hadoop.hbase.master.RegionState.State-org.apache.hadoop.hbase.master.RegionState.State...-">transitStateAndUpdate</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbas [...]
                      <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;newState,
                      <a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>...&nbsp;expectedStates)</code>&nbsp;</td>
 </tr>
-<tr id="i96" class="altColor">
+<tr id="i97" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#unassign-org.apache.hadoop.hbase.client.RegionInfo-">unassign</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr id="i97" class="rowColor">
+<tr id="i98" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateDeadServerRegionMetrics-int-int-">updateDeadServerRegionMetrics</a></span>(int&nbsp;deadRegions,
                              int&nbsp;unknownRegions)</code>&nbsp;</td>
 </tr>
-<tr id="i98" class="altColor">
+<tr id="i99" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionMergeTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">updateRegionMergeTransition</a></span>(<a  [...]
                            org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
@@ -859,11 +864,11 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr id="i99" class="rowColor">
+<tr id="i100" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionsInTransitionMetrics-org.apache.hadoop.hbase.master.assignment.AssignmentManager.RegionInTransitionStat-">updateRegionsInTransitionMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html" title="class in org.apache.hadoop.hbase.master.assignment">Assignme [...]
 </tr>
-<tr id="i100" class="altColor">
+<tr id="i101" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionSplitTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.client.RegionInfo-">updateRegionSplitTransition</a></span>(<a  [...]
                            org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
@@ -871,7 +876,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriA,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hriB)</code>&nbsp;</td>
 </tr>
-<tr id="i101" class="rowColor">
+<tr id="i102" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#updateRegionTransition-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode-org.apache.hadoop.hbase.client.RegionInfo-long-long-">updateRegionTransition</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org [...]
                       org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode&nbsp;state,
@@ -879,24 +884,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                       long&nbsp;seqId,
                       long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i102" class="altColor">
+<tr id="i103" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitMetaAssigned-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.client.RegionInfo-">waitMetaAssigned</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Notice that this event does not mean the AM has already finished region state rebuilding.</div>
 </td>
 </tr>
-<tr id="i103" class="rowColor">
+<tr id="i104" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitMetaLoaded-org.apache.hadoop.hbase.procedure2.Procedure-">waitMetaLoaded</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</code>
 <div class="block">Wait until AM finishes the meta loading, i.e, the region states rebuilding.</div>
 </td>
 </tr>
-<tr id="i104" class="altColor">
+<tr id="i105" class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a [...]
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#waitOnAssignQueue--">waitOnAssignQueue</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i105" class="rowColor">
+<tr id="i106" 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/assignment/AssignmentManager.html#wakeMetaLoadedEvent--">wakeMetaLoadedEvent</a></span>()</code>&nbsp;</td>
 </tr>
@@ -2617,13 +2622,23 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1912">processAssignQueue</a>()</pre>
 </li>
 </ul>
+<a name="containsBogusAssignments-java.util.Map-java.util.List-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>containsBogusAssignments</h4>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1975">containsBogusAssignments</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/h [...]
+                                         <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hirs)</pre>
+</li>
+</ul>
 <a name="processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>processAssignmentPlans</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1974">processAssignmentPlans</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.1986">processAssignmentPlans</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;retainMap,
                                     <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hris,
                                     <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
@@ -2635,7 +2650,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>acceptPlan</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2012">acceptPlan</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hba [...]
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2024">acceptPlan</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hba [...]
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</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/client/Region [...]
                  throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <dl>
@@ -2650,7 +2665,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addToPendingAssignment</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2041">addToPendingAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2062">addToPendingAssignment</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apach [...]
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;pendingRegions)</pre>
 </li>
 </ul>
@@ -2660,7 +2675,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getExcludedServersForSystemTable</h4>
-<pre>public&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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2057">getExcludedServersForSystemTable</a>()</pre>
+<pre>public&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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2078">getExcludedServersForSystemTable</a>()</pre>
 <div class="block">Get a list of servers that this region cannot be assigned to.
  For system tables, we must assign them to a server with highest version.</div>
 </li>
@@ -2671,7 +2686,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaster</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2077">getMaster</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2098">getMaster</a>()</pre>
 </li>
 </ul>
 <a name="getRSReports--">
@@ -2680,7 +2695,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRSReports</h4>
-<pre>public&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="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop [...]
+<pre>public&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="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop [...]
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>a snapshot of rsReports</dd>
@@ -2693,7 +2708,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionStatesCount</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionStatesCount.html" title="class in org.apache.hadoop.hbase.client">RegionStatesCount</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2099">getRegionStatesCount</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionStatesCount.html" title="class in org.apache.hadoop.hbase.client">RegionStatesCount</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2120">getRegionStatesCount</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Provide regions state count for given table.
  e.g howmany regions of give table are opened/closed/rit etc</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html
index 56f3d9b..443b76f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/class-use/RegionStateNode.html
@@ -605,22 +605,27 @@
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;pendingRegions)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#containsBogusAssignments-java.util.Map-java.util.List-">containsBogusAssignments</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/clie [...]
+                        <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hirs)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionStates.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStates.html#getRegionsOfTable-org.apache.hadoop.hbase.TableName-java.util.function.Predicate-">getRegionsOfTable</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>&gt;&nbsp;filter)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManagerUtil.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.html#lock-java.util.List-">lock</a></span>(<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/assignment/RegionStateNode.html" title="c [...]
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManager.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#processAssignmentPlans-java.util.HashMap-java.util.HashMap-java.util.List-java.util.List-">processAssignmentPlans</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../.. [...]
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html?is-external=true" title="class or interface in java.util">HashMap</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;retainMap,
                       <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;hris,
                       <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><span class="typeNameLabel">AssignmentManagerUtil.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.html#unlock-java.util.List-">unlock</a></span>(<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/assignment/RegionStateNode.html" titl [...]
 </tr>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
index b3e7c99..b988a3c 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
@@ -151,8 +151,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index 848d41f..c49c655 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -198,8 +198,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index cd55ac1..26d107e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -359,12 +359,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index a8186f6..973c948 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 282f57a..a0fb690 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -424,19 +424,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index c2c8266..43a6c8c 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 9dff654..8bd90de 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -240,11 +240,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 6837be1..4d3b720 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -718,20 +718,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index dc05e9f..b195b74 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index b0a3558..bbae212 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index 818a04c..02505ac 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -162,8 +162,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index cb72ed6..2e22b33 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -163,11 +163,11 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 3f42ad7..bd591e2 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -193,8 +193,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 2d9b08d..6b23a96 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -211,9 +211,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html
index 03c13b0..501371a 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html
@@ -390,7 +390,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/RSGrou
 <ul class="blockList">
 <li class="blockList">
 <h4>__jamon_innerUnit__rsgroup_requestStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html#line.368">__jamon_innerUnit__rsgroup_requestStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html#line.382">__jamon_innerUnit__rsgroup_requestStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                                      <a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfo.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupInfo</a>[]&nbsp;rsGroupInfos,
                                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerMetrics.html" title="interface in org.apache.hadoop.hbase">ServerMetrics</a>&gt;&nbsp;collectServers)
                                               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>
@@ -406,7 +406,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/RSGrou
 <ul class="blockListLast">
 <li class="blockList">
 <h4>__jamon_innerUnit__rsgroup_storeStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html#line.422">__jamon_innerUnit__rsgroup_storeStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RSGroupListTmplImpl.html#line.436">__jamon_innerUnit__rsgroup_storeStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                                    <a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfo.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupInfo</a>[]&nbsp;rsGroupInfos,
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/net/Address.html" title="class in org.apache.hadoop.hbase.net">Address</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerMetrics.html" title="interface in org.apache.hadoop.hbase">ServerMetrics</a>&gt;&nbsp;collectServers)
                                             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>
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html
index 4b4cbea..4c711c1 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html
@@ -392,7 +392,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Region
 <ul class="blockList">
 <li class="blockList">
 <h4>__jamon_innerUnit__replicationStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.364">__jamon_innerUnit__replicationStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.379">__jamon_innerUnit__replicationStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                                  <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&nbsp;serverNames)
                                           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>
@@ -407,7 +407,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Region
 <ul class="blockList">
 <li class="blockList">
 <h4>__jamon_innerUnit__requestStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.470">__jamon_innerUnit__requestStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.485">__jamon_innerUnit__requestStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                              <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&nbsp;serverNames)
                                       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>
@@ -422,7 +422,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Region
 <ul class="blockList">
 <li class="blockList">
 <h4>__jamon_innerUnit__serverNameLink</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.537">__jamon_innerUnit__serverNameLink</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.552">__jamon_innerUnit__serverNameLink</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                                <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -437,7 +437,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Region
 <ul class="blockListLast">
 <li class="blockList">
 <h4>__jamon_innerUnit__storeStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.575">__jamon_innerUnit__storeStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/RegionServerListTmplImpl.html#line.590">__jamon_innerUnit__storeStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                            <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&nbsp;serverNames)
                                     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>
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html
index 0d47247..5fd7208 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html
@@ -362,7 +362,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/
 <ul class="blockList">
 <li class="blockList">
 <h4>__jamon_innerUnit__requestStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html#line.278">__jamon_innerUnit__requestStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html#line.286">__jamon_innerUnit__requestStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                              <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;onlineRegions)
                                       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>
@@ -377,7 +377,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>__jamon_innerUnit__storeStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html#line.331">__jamon_innerUnit__storeStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RegionListTmplImpl.html#line.339">__jamon_innerUnit__storeStats</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;jamonWriter,
                                            <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/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;onlineRegions)
                                     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>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/VersionInfo.html b/devapidocs/org/apache/hadoop/hbase/util/VersionInfo.html
index 5302382..0d42661 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/VersionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/VersionInfo.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -183,36 +183,40 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>static int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getMajorVersion-java.lang.String-">getMajorVersion</a></span>(<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;version)</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getRevision--">getRevision</a></span>()</code>
 <div class="block">Get the subversion revision number for the root directory</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getSrcChecksum--">getSrcChecksum</a></span>()</code>
 <div class="block">Get the checksum of the source files from which Hadoop was compiled.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getUrl--">getUrl</a></span>()</code>
 <div class="block">Get the subversion URL for the root hbase directory.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getUser--">getUser</a></span>()</code>
 <div class="block">The user that compiled hbase.</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getVersion--">getVersion</a></span>()</code>
 <div class="block">Get the hbase version.</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#getVersionComponents-java.lang.String-">getVersionComponents</a></span>(<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;version)</code>
 <div class="block">Returns the version components as String objects
@@ -221,23 +225,23 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  "4.5.6-UNKNOW" returns ["4", "5", "6", "-4"]</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#logVersion--">logVersion</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#main-java.lang.String:A-">main</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>(package private) static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#versionReport--">versionReport</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#writeTo-java.io.PrintStream-">writeTo</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html?is-external=true" title="class or interface in java.io">PrintStream</a>&nbsp;out)</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html#writeTo-java.io.PrintWriter-">writeTo</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html?is-external=true" title="class or interface in java.io">PrintWriter</a>&nbsp;out)</code>&nbsp;</td>
 </tr>
@@ -457,13 +461,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="getMajorVersion-java.lang.String-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getMajorVersion</h4>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/VersionInfo.html#line.169">getMajorVersion</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;version)</pre>
+</li>
+</ul>
 <a name="main-java.lang.String:A-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/VersionInfo.html#line.169">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/VersionInfo.html#line.173">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 2ef6b1d..d0d6582 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -541,14 +541,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HbckErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HbckErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index bdae3d8..8c4c41b 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -192,8 +192,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true [...]
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 6945cf3..367ff76 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -14,14 +14,16 @@
 <span class="sourceLineNo">006</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.6"></a>
 <span class="sourceLineNo">007</span><a name="line.7"></a>
 <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 = "e911bb7e21a2dad6f2e595868914533ae731d0da";<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 = "Tue Oct  8 14:35:01 UTC 2019";<a name="line.13"></a>
-<span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites-he-de.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "(stdin)=";<a name="line.15"></a>
-<span class="sourceLineNo">016</span>}<a name="line.16"></a>
+<span class="sourceLineNo">009</span>@edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DM_STRING_CTOR",<a name="line.9"></a>
+<span class="sourceLineNo">010</span>  justification="Intentional; to be modified in test")<a name="line.10"></a>
+<span class="sourceLineNo">011</span>public class Version {<a name="line.11"></a>
+<span class="sourceLineNo">012</span>  public static final String version = new String("3.0.0-SNAPSHOT");<a name="line.12"></a>
+<span class="sourceLineNo">013</span>  public static final String revision = "fdac2ddc81c785d9e6d44465d8d4893c15fdab72";<a name="line.13"></a>
+<span class="sourceLineNo">014</span>  public static final String user = "jenkins";<a name="line.14"></a>
+<span class="sourceLineNo">015</span>  public static final String date = "Wed Oct  9 14:39:28 UTC 2019";<a name="line.15"></a>
+<span class="sourceLineNo">016</span>  public static final String url = "git://jenkins-websites-he-de.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.16"></a>
+<span class="sourceLineNo">017</span>  public static final String srcChecksum = "(stdin)=";<a name="line.17"></a>
+<span class="sourceLineNo">018</span>}<a name="line.18"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.TableInfo.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.TableInfo.html
index 3a09c42..6379267 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.TableInfo.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.TableInfo.html
@@ -243,9 +243,9 @@
 <span class="sourceLineNo">235</span>      // Map of families to writers and how much has been output on the writer.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>      private final Map&lt;byte[], WriterLength&gt; writers =<a name="line.236"></a>
 <span class="sourceLineNo">237</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      private byte[] previousRow = HConstants.EMPTY_BYTE_ARRAY;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      private boolean rollRequested = false;<a name="line.240"></a>
+<span class="sourceLineNo">238</span>      private final Map&lt;byte[], byte[]&gt; previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
 <span class="sourceLineNo">242</span>      @Override<a name="line.242"></a>
 <span class="sourceLineNo">243</span>      public void write(ImmutableBytesWritable row, V cell)<a name="line.243"></a>
@@ -294,658 +294,654 @@
 <span class="sourceLineNo">286</span>          configureStoragePolicy(conf, fs, tableAndFamily, writerPath);<a name="line.286"></a>
 <span class="sourceLineNo">287</span>        }<a name="line.287"></a>
 <span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          this.rollRequested = true;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>        // This can only happen once a row is finished though<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        if (rollRequested &amp;&amp; Bytes.compareTo(this.previousRow, rowKey) != 0) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          rollWriters(wl);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        // create a new WAL writer, if necessary<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        if (wl == null || wl.writer == null) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            HRegionLocation loc = null;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>            if (tableName != null) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>                     RegionLocator locator =<a name="line.305"></a>
-<span class="sourceLineNo">306</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>                loc = locator.getRegionLocation(rowKey);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>              } catch (Throwable e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                loc = null;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>              } }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>            if (null == loc) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              if (LOG.isTraceEnabled()) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.316"></a>
-<span class="sourceLineNo">317</span>                  Bytes.toString(rowKey));<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>            } else {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>              if (LOG.isDebugEnabled()) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>              }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>              InetSocketAddress initialIsa =<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>              if (initialIsa.isUnresolved()) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>                if (LOG.isTraceEnabled()) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.328"></a>
-<span class="sourceLineNo">329</span>                      + loc.getPort() + ", so use default writer");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>              } else {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>                if (LOG.isDebugEnabled()) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<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>          } else {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>        // we now have the proper WAL writer. full steam ahead<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        wl.writer.append(kv);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        wl.written += length;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>        // Copy the row so we know when a row transition.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        this.previousRow = rowKey;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        String[] tableNameParts = tableName.split(":");<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        if (tableNameParts.length &gt; 1) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        return tableRelPath;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        if (writerLength != null) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          closeWriter(writerLength);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          for (WriterLength wl : this.writers.values()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            closeWriter(wl);<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>        this.rollRequested = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        if (wl.writer != null) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          LOG.info(<a name="line.376"></a>
-<span class="sourceLineNo">377</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          close(wl.writer);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        wl.writer = null;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        wl.written = 0;<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>       * Create a new StoreFile.Writer.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>       * @param family<a name="line.386"></a>
-<span class="sourceLineNo">387</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>       * @throws IOException<a name="line.388"></a>
-<span class="sourceLineNo">389</span>       */<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          justification="Not important")<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        if (writeMultipleTables) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          familydir = new Path(outputDir,<a name="line.397"></a>
-<span class="sourceLineNo">398</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        WriterLength wl = new WriterLength();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Algorithm compression = overriddenCompression;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        compression = compression == null ? defaultCompression : compression;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                                    .withCompression(compression)<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                                    .withBlockSize(blockSize);<a name="line.419"></a>
+<span class="sourceLineNo">289</span>        // This can only happen once a row is finished though<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span>                &amp;&amp; Bytes.compareTo(this.previousRows.get(family), rowKey) != 0) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          rollWriters(wl);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>        // create a new WAL writer, if necessary<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (wl == null || wl.writer == null) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            HRegionLocation loc = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>            if (tableName != null) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>                     RegionLocator locator =<a name="line.302"></a>
+<span class="sourceLineNo">303</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                loc = locator.getRegionLocation(rowKey);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>              } catch (Throwable e) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.306"></a>
+<span class="sourceLineNo">307</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>                loc = null;<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>            if (null == loc) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>              if (LOG.isTraceEnabled()) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>                  Bytes.toString(rowKey));<a name="line.314"></a>
+<span class="sourceLineNo">315</span>              }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            } else {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>              if (LOG.isDebugEnabled()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>              }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              InetSocketAddress initialIsa =<a name="line.321"></a>
+<span class="sourceLineNo">322</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>              if (initialIsa.isUnresolved()) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>                if (LOG.isTraceEnabled()) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.325"></a>
+<span class="sourceLineNo">326</span>                      + loc.getPort() + ", so use default writer");<a name="line.326"></a>
+<span class="sourceLineNo">327</span>                }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>              } else {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>                if (LOG.isDebugEnabled()) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>                }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<a name="line.333"></a>
+<span class="sourceLineNo">334</span>                });<a name="line.334"></a>
+<span class="sourceLineNo">335</span>              }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>            }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          } else {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<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>        // we now have the proper WAL writer. full steam ahead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        wl.writer.append(kv);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        wl.written += length;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>        // Copy the row so we know when a row transition.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        this.previousRows.put(family, rowKey);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        String[] tableNameParts = tableName.split(":");<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        if (tableNameParts.length &gt; 1) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        return tableRelPath;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        if (writerLength != null) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          closeWriter(writerLength);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        } else {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          for (WriterLength wl : this.writers.values()) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>            closeWriter(wl);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        if (wl.writer != null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          LOG.info(<a name="line.372"></a>
+<span class="sourceLineNo">373</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          close(wl.writer);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        wl.writer = null;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        wl.written = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      /*<a name="line.380"></a>
+<span class="sourceLineNo">381</span>       * Create a new StoreFile.Writer.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>       * @param family<a name="line.382"></a>
+<span class="sourceLineNo">383</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>       * @throws IOException<a name="line.384"></a>
+<span class="sourceLineNo">385</span>       */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          justification="Not important")<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.388"></a>
+<span class="sourceLineNo">389</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        if (writeMultipleTables) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          familydir = new Path(outputDir,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        WriterLength wl = new WriterLength();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        Algorithm compression = overriddenCompression;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        compression = compression == null ? defaultCompression : compression;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                                    .withCompression(compression)<a name="line.412"></a>
+<span class="sourceLineNo">413</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.413"></a>
+<span class="sourceLineNo">414</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.414"></a>
+<span class="sourceLineNo">415</span>                                    .withBlockSize(blockSize);<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          contextBuilder.withIncludesTags(true);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          contextBuilder.withIncludesTags(true);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        if (null == favoredNodes) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          wl.writer =<a name="line.428"></a>
-<span class="sourceLineNo">429</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        } else {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          wl.writer =<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.434"></a>
-<span class="sourceLineNo">435</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>                  .withFavoredNodes(favoredNodes).build();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">421</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        if (null == favoredNodes) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          wl.writer =<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        } else {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          wl.writer =<a name="line.429"></a>
+<span class="sourceLineNo">430</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  .withFavoredNodes(favoredNodes).build();<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>        this.writers.put(tableAndFamily, wl);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        return wl;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
 <span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>        this.writers.put(tableAndFamily, wl);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return wl;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (w != null) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.446"></a>
-<span class="sourceLineNo">447</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toBytes(true));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.452"></a>
-<span class="sourceLineNo">453</span>              Bytes.toBytes(compactionExclude));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          w.appendTrackedTimestampsToMetadata();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          w.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      @Override<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      public void close(TaskAttemptContext c)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException, InterruptedException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        for (WriterLength wl: this.writers.values()) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          close(wl.writer);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    };<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>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Configure block storage policy for CF after the directory is created.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   */<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      return;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    String policy =<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  /*<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  static class WriterLength {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    long written = 0;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    StoreFileWriter writer = null;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  }<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>   * Return the start keys of all of the regions in this table,<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * as a list of ImmutableBytesWritable.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                                                                 boolean writeMultipleTables)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      TableName tableName = regionLocator.getName();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      for (byte[] byteKey : byteKeys) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (writeMultipleTables)<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          //MultiTableHFileOutputFormat use case<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.511"></a>
+<span class="sourceLineNo">440</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        if (w != null) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>              Bytes.toBytes(true));<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>              Bytes.toBytes(compactionExclude));<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          w.appendTrackedTimestampsToMetadata();<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          w.close();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>      @Override<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      public void close(TaskAttemptContext c)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException, InterruptedException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        for (WriterLength wl: this.writers.values()) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          close(wl.writer);<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>    };<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * Configure block storage policy for CF after the directory is created.<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      return;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>    String policy =<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  /*<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  static class WriterLength {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    long written = 0;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    StoreFileWriter writer = null;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  /**<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * Return the start keys of all of the regions in this table,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * as a list of ImmutableBytesWritable.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   */<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>                                                                 boolean writeMultipleTables)<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          throws IOException {<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      TableName tableName = regionLocator.getName();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      for (byte[] byteKey : byteKeys) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        if (writeMultipleTables)<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          //MultiTableHFileOutputFormat use case<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        if (LOG.isDebugEnabled()) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.510"></a>
+<span class="sourceLineNo">511</span>                  (fullKey) + "]");<a name="line.511"></a>
 <span class="sourceLineNo">512</span>        }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>        if (LOG.isDebugEnabled()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.514"></a>
-<span class="sourceLineNo">515</span>                  (fullKey) + "]");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    return ret;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>  /**<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  @SuppressWarnings("deprecation")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (startKeys.isEmpty()) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      throw new IllegalArgumentException("No regions passed");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    // We're generating a list of split points, and we don't ever<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // empty reducer with index 0<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    ImmutableBytesWritable first = sorted.first();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    if (writeMultipleTables) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.542"></a>
-<span class="sourceLineNo">543</span>              ().get()));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      throw new IllegalArgumentException(<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "First region of table should have empty start key. Instead has: "<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          + Bytes.toStringBinary(first.get()));<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    sorted.remove(sorted.first());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>    // Write the actual file<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      NullWritable.class);<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>    try {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        writer.append(startKey, NullWritable.get());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      writer.close();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  /**<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * table. This<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * &lt;ul&gt;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * &lt;/ul&gt;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * running this function.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * table. This<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * &lt;ul&gt;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * &lt;/ul&gt;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * running this function.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
-<span class="sourceLineNo">600</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      RegionLocator regionLocator) throws IOException {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Configuration conf = job.getConfiguration();<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    job.setOutputFormatClass(cls);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    boolean writeMultipleTables = false;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      writeMultipleTables = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // sort the incoming values.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      job.setReducerClass(CellSortReducer.class);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      job.setReducerClass(PutSortReducer.class);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      job.setReducerClass(TextSortReducer.class);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    } else {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
+<span class="sourceLineNo">513</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return ret;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>  /**<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  @SuppressWarnings("deprecation")<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    if (startKeys.isEmpty()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      throw new IllegalArgumentException("No regions passed");<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    // We're generating a list of split points, and we don't ever<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    // empty reducer with index 0<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    ImmutableBytesWritable first = sorted.first();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    if (writeMultipleTables) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              ().get()));<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    }<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      throw new IllegalArgumentException(<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          "First region of table should have empty start key. Instead has: "<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          + Bytes.toStringBinary(first.get()));<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    sorted.remove(sorted.first());<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Write the actual file<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      NullWritable.class);<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>    try {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        writer.append(startKey, NullWritable.get());<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    } finally {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      writer.close();<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">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>  /**<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   * table. This<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   * &lt;ul&gt;<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>   * &lt;/ul&gt;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   * running this function.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   */<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      throws IOException {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>  }<a name="line.580"></a>
+<span class="sourceLineNo">581</span><a name="line.581"></a>
+<span class="sourceLineNo">582</span>  /**<a name="line.582"></a>
+<span class="sourceLineNo">583</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * table. This<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * &lt;ul&gt;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * &lt;/ul&gt;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * running this function.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   */<a name="line.595"></a>
+<span class="sourceLineNo">596</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      RegionLocator regionLocator) throws IOException {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    Configuration conf = job.getConfiguration();<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    job.setOutputFormatClass(cls);<a name="line.608"></a>
+<span class="sourceLineNo">609</span><a name="line.609"></a>
+<span class="sourceLineNo">610</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    boolean writeMultipleTables = false;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      writeMultipleTables = true;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // sort the incoming values.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      job.setReducerClass(CellSortReducer.class);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      job.setReducerClass(PutSortReducer.class);<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      job.setReducerClass(TextSortReducer.class);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    } else {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        CellSerialization.class.getName());<a name="line.634"></a>
 <span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        CellSerialization.class.getName());<a name="line.638"></a>
+<span class="sourceLineNo">636</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
 <span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    /* Now get the region start keys for every table required */<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      String tn = writeMultipleTables?<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      allTableNames.add(tn);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.659"></a>
-<span class="sourceLineNo">660</span>            .toString(tableSeparator)));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    // Use table's region boundaries for TOP split points.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        "to match current region count for all tables");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    job.setNumReduceTasks(startKeys.size());<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    // Set compression algorithms based on column families<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.670"></a>
+<span class="sourceLineNo">640</span>    /* Now get the region start keys for every table required */<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      String tn = writeMultipleTables?<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.649"></a>
+<span class="sourceLineNo">650</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      allTableNames.add(tn);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>            .toString(tableSeparator)));<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    // Use table's region boundaries for TOP split points.<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        "to match current region count for all tables");<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    job.setNumReduceTasks(startKeys.size());<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    // Set compression algorithms based on column families<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.666"></a>
+<span class="sourceLineNo">667</span>            tableDescriptors));<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            tableDescriptors));<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.670"></a>
 <span class="sourceLineNo">671</span>            tableDescriptors));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>            tableDescriptors));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            tableDescriptors));<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        tableDescriptors));<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.678"></a>
-<span class="sourceLineNo">679</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    TableMapReduceUtil.initCredentials(job);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">672</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        tableDescriptors));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.674"></a>
+<span class="sourceLineNo">675</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    TableMapReduceUtil.initCredentials(job);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.679"></a>
+<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
+<span class="sourceLineNo">681</span><a name="line.681"></a>
+<span class="sourceLineNo">682</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      IOException {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    Configuration conf = job.getConfiguration();<a name="line.684"></a>
 <span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      IOException {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    Configuration conf = job.getConfiguration();<a name="line.688"></a>
+<span class="sourceLineNo">686</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // Set compression algorithms based on column families<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.708"></a>
-<span class="sourceLineNo">709</span><a name="line.709"></a>
-<span class="sourceLineNo">710</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    TableMapReduceUtil.initCredentials(job);<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.712"></a>
-<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>  /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   * map from the configuration.<a name="line.717"></a>
-<span class="sourceLineNo">718</span>   *<a name="line.718"></a>
-<span class="sourceLineNo">719</span>   * @param conf to read the serialized values from<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * @return a map from column family to the configured compression algorithm<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  @VisibleForTesting<a name="line.722"></a>
-<span class="sourceLineNo">723</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return compressionMap;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  /**<a name="line.735"></a>
-<span class="sourceLineNo">736</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.736"></a>
-<span class="sourceLineNo">737</span>   * map from the configuration.<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   *<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * @param conf to read the serialized values from<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   * @return a map from column family to the the configured bloom filter type<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  @VisibleForTesting<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    return bloomTypeMap;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   * map from the configuration.<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   *<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @param conf to read the serialized values from<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   * @return a map from column family to the the configured bloom filter param<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   */<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  @VisibleForTesting<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>  /**<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * Runs inside the task to deserialize column family to block size<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * map from the configuration.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   *<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   * @param conf to read the serialized values from<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @return a map from column family to the configured block size<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   */<a name="line.773"></a>
-<span class="sourceLineNo">774</span>  @VisibleForTesting<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    return blockSizeMap;<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   * type map from the configuration.<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   *<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * @param conf to read the serialized values from<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   *         configured data block type for the family<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   */<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  @VisibleForTesting<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    return encoderMap;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   *<a name="line.809"></a>
-<span class="sourceLineNo">810</span>   * @param conf to read the serialized values from<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * @param confName conf key to read from the configuration<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @return a map of column family to the given configuration value<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      Configuration conf, String confName) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    String confVal = conf.get(confName, "");<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      String[] familySplit = familyConf.split("=");<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      if (familySplit.length != 2) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>        continue;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      }<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.824"></a>
-<span class="sourceLineNo">825</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      } catch (UnsupportedEncodingException e) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        // will not happen with UTF-8 encoding<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        throw new AssertionError(e);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return confValMap;<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   */<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          writeMultipleTables)<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      throws IOException {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    Configuration conf = job.getConfiguration();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    // create the partitions file<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    FileSystem fs = FileSystem.get(conf);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    String hbaseTmpFsDir =<a name="line.844"></a>
-<span class="sourceLineNo">845</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    fs.makeQualified(partitionsPath);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    fs.deleteOnExit(partitionsPath);<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>    // configure job to use it<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>  }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.857"></a>
-<span class="sourceLineNo">858</span>  @VisibleForTesting<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      throws UnsupportedEncodingException {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int i = 0;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      if (tableDescriptor == null) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        // could happen with mock table instance<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        return "";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        if (i++ &gt; 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          attributeValue.append('&amp;');<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(<a name="line.873"></a>
-<span class="sourceLineNo">874</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.874"></a>
-<span class="sourceLineNo">875</span>            "UTF-8"));<a name="line.875"></a>
-<span class="sourceLineNo">876</span>        attributeValue.append('=');<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    // Get rid of the last ampersand<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    return attributeValue.toString();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  }<a name="line.882"></a>
-<span class="sourceLineNo">883</span><a name="line.883"></a>
-<span class="sourceLineNo">884</span>  /**<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * Invoked while configuring the MR job for incremental load.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  @VisibleForTesting<a name="line.888"></a>
-<span class="sourceLineNo">889</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>          familyDescriptor.getCompressionType().getName();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>  /**<a name="line.892"></a>
-<span class="sourceLineNo">893</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * configuring the MR job for incremental load.<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   */<a name="line.895"></a>
-<span class="sourceLineNo">896</span>  @VisibleForTesting<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   * configuring the MR job for incremental load.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   */<a name="line.903"></a>
-<span class="sourceLineNo">904</span>  @VisibleForTesting<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    if (bloomType == null) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    return bloomType;<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  };<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * configuring the MR job for incremental load.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   */<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  @VisibleForTesting<a name="line.917"></a>
-<span class="sourceLineNo">918</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    String bloomParam = "";<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    return bloomParam;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>  };<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>  /**<a name="line.927"></a>
-<span class="sourceLineNo">928</span>   * Serialize column family to data block encoding map to configuration.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * Invoked while configuring the MR job for incremental load.<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  @VisibleForTesting<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (encoding == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      encoding = DataBlockEncoding.NONE;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return encoding.toString();<a name="line.937"></a>
-<span class="sourceLineNo">938</span>  };<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>}<a name="line.940"></a>
+<span class="sourceLineNo">690</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    // Set compression algorithms based on column families<a name="line.694"></a>
+<span class="sourceLineNo">695</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.699"></a>
+<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.704"></a>
+<span class="sourceLineNo">705</span><a name="line.705"></a>
+<span class="sourceLineNo">706</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    TableMapReduceUtil.initCredentials(job);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   * map from the configuration.<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   *<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * @param conf to read the serialized values from<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * @return a map from column family to the configured compression algorithm<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
+<span class="sourceLineNo">718</span>  @VisibleForTesting<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.721"></a>
+<span class="sourceLineNo">722</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    return compressionMap;<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>  /**<a name="line.731"></a>
+<span class="sourceLineNo">732</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.732"></a>
+<span class="sourceLineNo">733</span>   * map from the configuration.<a name="line.733"></a>
+<span class="sourceLineNo">734</span>   *<a name="line.734"></a>
+<span class="sourceLineNo">735</span>   * @param conf to read the serialized values from<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * @return a map from column family to the the configured bloom filter type<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   */<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  @VisibleForTesting<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    }<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    return bloomTypeMap;<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   * map from the configuration.<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   *<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @param conf to read the serialized values from<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * @return a map from column family to the the configured bloom filter param<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   */<a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @VisibleForTesting<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  /**<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * Runs inside the task to deserialize column family to block size<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * map from the configuration.<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   *<a name="line.766"></a>
+<span class="sourceLineNo">767</span>   * @param conf to read the serialized values from<a name="line.767"></a>
+<span class="sourceLineNo">768</span>   * @return a map from column family to the configured block size<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   */<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  @VisibleForTesting<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.772"></a>
+<span class="sourceLineNo">773</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    return blockSizeMap;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  /**<a name="line.782"></a>
+<span class="sourceLineNo">783</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.783"></a>
+<span class="sourceLineNo">784</span>   * type map from the configuration.<a name="line.784"></a>
+<span class="sourceLineNo">785</span>   *<a name="line.785"></a>
+<span class="sourceLineNo">786</span>   * @param conf to read the serialized values from<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   *         configured data block type for the family<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   */<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  @VisibleForTesting<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    }<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return encoderMap;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span><a name="line.802"></a>
+<span class="sourceLineNo">803</span>  /**<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   *<a name="line.805"></a>
+<span class="sourceLineNo">806</span>   * @param conf to read the serialized values from<a name="line.806"></a>
+<span class="sourceLineNo">807</span>   * @param confName conf key to read from the configuration<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   * @return a map of column family to the given configuration value<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      Configuration conf, String confName) {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    String confVal = conf.get(confName, "");<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      String[] familySplit = familyConf.split("=");<a name="line.815"></a>
+<span class="sourceLineNo">816</span>      if (familySplit.length != 2) {<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        continue;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      }<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      } catch (UnsupportedEncodingException e) {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        // will not happen with UTF-8 encoding<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        throw new AssertionError(e);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    return confValMap;<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  }<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>  /**<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   */<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.834"></a>
+<span class="sourceLineNo">835</span>          writeMultipleTables)<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      throws IOException {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    Configuration conf = job.getConfiguration();<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    // create the partitions file<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    FileSystem fs = FileSystem.get(conf);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    String hbaseTmpFsDir =<a name="line.840"></a>
+<span class="sourceLineNo">841</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    fs.makeQualified(partitionsPath);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    fs.deleteOnExit(partitionsPath);<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    // configure job to use it<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.853"></a>
+<span class="sourceLineNo">854</span>  @VisibleForTesting<a name="line.854"></a>
+<span class="sourceLineNo">855</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      throws UnsupportedEncodingException {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    int i = 0;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      if (tableDescriptor == null) {<a name="line.860"></a>
+<span class="sourceLineNo">861</span>        // could happen with mock table instance<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        return "";<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      }<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>        if (i++ &gt; 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>          attributeValue.append('&amp;');<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        attributeValue.append(URLEncoder.encode(<a name="line.869"></a>
+<span class="sourceLineNo">870</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.870"></a>
+<span class="sourceLineNo">871</span>            "UTF-8"));<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        attributeValue.append('=');<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      }<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    // Get rid of the last ampersand<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    return attributeValue.toString();<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * Invoked while configuring the MR job for incremental load.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  @VisibleForTesting<a name="line.884"></a>
+<span class="sourceLineNo">885</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>          familyDescriptor.getCompressionType().getName();<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.889"></a>
+<span class="sourceLineNo">890</span>   * configuring the MR job for incremental load.<a name="line.890"></a>
+<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
+<span class="sourceLineNo">892</span>  @VisibleForTesting<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.893"></a>
+<span class="sourceLineNo">894</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.894"></a>
+<span class="sourceLineNo">895</span><a name="line.895"></a>
+<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * configuring the MR job for incremental load.<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   */<a name="line.899"></a>
+<span class="sourceLineNo">900</span>  @VisibleForTesting<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    if (bloomType == null) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    return bloomType;<a name="line.906"></a>
+<span class="sourceLineNo">907</span>  };<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>  /**<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   * configuring the MR job for incremental load.<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   */<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  @VisibleForTesting<a name="line.913"></a>
+<span class="sourceLineNo">914</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    String bloomParam = "";<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    }<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    return bloomParam;<a name="line.920"></a>
+<span class="sourceLineNo">921</span>  };<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>  /**<a name="line.923"></a>
+<span class="sourceLineNo">924</span>   * Serialize column family to data block encoding map to configuration.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>   * Invoked while configuring the MR job for incremental load.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>   */<a name="line.926"></a>
+<span class="sourceLineNo">927</span>  @VisibleForTesting<a name="line.927"></a>
+<span class="sourceLineNo">928</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    if (encoding == null) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      encoding = DataBlockEncoding.NONE;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    }<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    return encoding.toString();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>  };<a name="line.934"></a>
+<span class="sourceLineNo">935</span><a name="line.935"></a>
+<span class="sourceLineNo">936</span>}<a name="line.936"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html
index 3a09c42..6379267 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.WriterLength.html
@@ -243,9 +243,9 @@
 <span class="sourceLineNo">235</span>      // Map of families to writers and how much has been output on the writer.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>      private final Map&lt;byte[], WriterLength&gt; writers =<a name="line.236"></a>
 <span class="sourceLineNo">237</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      private byte[] previousRow = HConstants.EMPTY_BYTE_ARRAY;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      private boolean rollRequested = false;<a name="line.240"></a>
+<span class="sourceLineNo">238</span>      private final Map&lt;byte[], byte[]&gt; previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
 <span class="sourceLineNo">242</span>      @Override<a name="line.242"></a>
 <span class="sourceLineNo">243</span>      public void write(ImmutableBytesWritable row, V cell)<a name="line.243"></a>
@@ -294,658 +294,654 @@
 <span class="sourceLineNo">286</span>          configureStoragePolicy(conf, fs, tableAndFamily, writerPath);<a name="line.286"></a>
 <span class="sourceLineNo">287</span>        }<a name="line.287"></a>
 <span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          this.rollRequested = true;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>        // This can only happen once a row is finished though<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        if (rollRequested &amp;&amp; Bytes.compareTo(this.previousRow, rowKey) != 0) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          rollWriters(wl);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        // create a new WAL writer, if necessary<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        if (wl == null || wl.writer == null) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            HRegionLocation loc = null;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>            if (tableName != null) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>                     RegionLocator locator =<a name="line.305"></a>
-<span class="sourceLineNo">306</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>                loc = locator.getRegionLocation(rowKey);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>              } catch (Throwable e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                loc = null;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>              } }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>            if (null == loc) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              if (LOG.isTraceEnabled()) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.316"></a>
-<span class="sourceLineNo">317</span>                  Bytes.toString(rowKey));<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>            } else {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>              if (LOG.isDebugEnabled()) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>              }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>              InetSocketAddress initialIsa =<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>              if (initialIsa.isUnresolved()) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>                if (LOG.isTraceEnabled()) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.328"></a>
-<span class="sourceLineNo">329</span>                      + loc.getPort() + ", so use default writer");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>              } else {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>                if (LOG.isDebugEnabled()) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<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>          } else {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>        // we now have the proper WAL writer. full steam ahead<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        wl.writer.append(kv);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        wl.written += length;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>        // Copy the row so we know when a row transition.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        this.previousRow = rowKey;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        String[] tableNameParts = tableName.split(":");<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        if (tableNameParts.length &gt; 1) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        return tableRelPath;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        if (writerLength != null) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          closeWriter(writerLength);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          for (WriterLength wl : this.writers.values()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            closeWriter(wl);<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>        this.rollRequested = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        if (wl.writer != null) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          LOG.info(<a name="line.376"></a>
-<span class="sourceLineNo">377</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          close(wl.writer);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        wl.writer = null;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        wl.written = 0;<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>       * Create a new StoreFile.Writer.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>       * @param family<a name="line.386"></a>
-<span class="sourceLineNo">387</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>       * @throws IOException<a name="line.388"></a>
-<span class="sourceLineNo">389</span>       */<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          justification="Not important")<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        if (writeMultipleTables) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          familydir = new Path(outputDir,<a name="line.397"></a>
-<span class="sourceLineNo">398</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        WriterLength wl = new WriterLength();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Algorithm compression = overriddenCompression;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        compression = compression == null ? defaultCompression : compression;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                                    .withCompression(compression)<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                                    .withBlockSize(blockSize);<a name="line.419"></a>
+<span class="sourceLineNo">289</span>        // This can only happen once a row is finished though<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span>                &amp;&amp; Bytes.compareTo(this.previousRows.get(family), rowKey) != 0) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          rollWriters(wl);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>        // create a new WAL writer, if necessary<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (wl == null || wl.writer == null) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            HRegionLocation loc = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>            if (tableName != null) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>                     RegionLocator locator =<a name="line.302"></a>
+<span class="sourceLineNo">303</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                loc = locator.getRegionLocation(rowKey);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>              } catch (Throwable e) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.306"></a>
+<span class="sourceLineNo">307</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>                loc = null;<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>            if (null == loc) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>              if (LOG.isTraceEnabled()) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>                  Bytes.toString(rowKey));<a name="line.314"></a>
+<span class="sourceLineNo">315</span>              }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            } else {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>              if (LOG.isDebugEnabled()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>              }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              InetSocketAddress initialIsa =<a name="line.321"></a>
+<span class="sourceLineNo">322</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>              if (initialIsa.isUnresolved()) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>                if (LOG.isTraceEnabled()) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.325"></a>
+<span class="sourceLineNo">326</span>                      + loc.getPort() + ", so use default writer");<a name="line.326"></a>
+<span class="sourceLineNo">327</span>                }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>              } else {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>                if (LOG.isDebugEnabled()) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>                }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<a name="line.333"></a>
+<span class="sourceLineNo">334</span>                });<a name="line.334"></a>
+<span class="sourceLineNo">335</span>              }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>            }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          } else {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<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>        // we now have the proper WAL writer. full steam ahead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        wl.writer.append(kv);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        wl.written += length;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>        // Copy the row so we know when a row transition.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        this.previousRows.put(family, rowKey);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        String[] tableNameParts = tableName.split(":");<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        if (tableNameParts.length &gt; 1) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        return tableRelPath;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        if (writerLength != null) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          closeWriter(writerLength);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        } else {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          for (WriterLength wl : this.writers.values()) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>            closeWriter(wl);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        if (wl.writer != null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          LOG.info(<a name="line.372"></a>
+<span class="sourceLineNo">373</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          close(wl.writer);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        wl.writer = null;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        wl.written = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      /*<a name="line.380"></a>
+<span class="sourceLineNo">381</span>       * Create a new StoreFile.Writer.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>       * @param family<a name="line.382"></a>
+<span class="sourceLineNo">383</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>       * @throws IOException<a name="line.384"></a>
+<span class="sourceLineNo">385</span>       */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          justification="Not important")<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.388"></a>
+<span class="sourceLineNo">389</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        if (writeMultipleTables) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          familydir = new Path(outputDir,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        WriterLength wl = new WriterLength();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        Algorithm compression = overriddenCompression;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        compression = compression == null ? defaultCompression : compression;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                                    .withCompression(compression)<a name="line.412"></a>
+<span class="sourceLineNo">413</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.413"></a>
+<span class="sourceLineNo">414</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.414"></a>
+<span class="sourceLineNo">415</span>                                    .withBlockSize(blockSize);<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          contextBuilder.withIncludesTags(true);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          contextBuilder.withIncludesTags(true);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        if (null == favoredNodes) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          wl.writer =<a name="line.428"></a>
-<span class="sourceLineNo">429</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        } else {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          wl.writer =<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.434"></a>
-<span class="sourceLineNo">435</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>                  .withFavoredNodes(favoredNodes).build();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">421</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        if (null == favoredNodes) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          wl.writer =<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        } else {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          wl.writer =<a name="line.429"></a>
+<span class="sourceLineNo">430</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  .withFavoredNodes(favoredNodes).build();<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>        this.writers.put(tableAndFamily, wl);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        return wl;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
 <span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>        this.writers.put(tableAndFamily, wl);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return wl;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (w != null) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.446"></a>
-<span class="sourceLineNo">447</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toBytes(true));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.452"></a>
-<span class="sourceLineNo">453</span>              Bytes.toBytes(compactionExclude));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          w.appendTrackedTimestampsToMetadata();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          w.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      @Override<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      public void close(TaskAttemptContext c)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException, InterruptedException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        for (WriterLength wl: this.writers.values()) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          close(wl.writer);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    };<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>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Configure block storage policy for CF after the directory is created.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   */<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      return;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    String policy =<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  /*<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  static class WriterLength {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    long written = 0;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    StoreFileWriter writer = null;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  }<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>   * Return the start keys of all of the regions in this table,<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * as a list of ImmutableBytesWritable.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                                                                 boolean writeMultipleTables)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      TableName tableName = regionLocator.getName();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      for (byte[] byteKey : byteKeys) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (writeMultipleTables)<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          //MultiTableHFileOutputFormat use case<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.511"></a>
+<span class="sourceLineNo">440</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        if (w != null) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>              Bytes.toBytes(true));<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>              Bytes.toBytes(compactionExclude));<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          w.appendTrackedTimestampsToMetadata();<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          w.close();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>      @Override<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      public void close(TaskAttemptContext c)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException, InterruptedException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        for (WriterLength wl: this.writers.values()) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          close(wl.writer);<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>    };<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * Configure block storage policy for CF after the directory is created.<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      return;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>    String policy =<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  /*<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  static class WriterLength {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    long written = 0;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    StoreFileWriter writer = null;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  /**<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * Return the start keys of all of the regions in this table,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * as a list of ImmutableBytesWritable.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   */<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>                                                                 boolean writeMultipleTables)<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          throws IOException {<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      TableName tableName = regionLocator.getName();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      for (byte[] byteKey : byteKeys) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        if (writeMultipleTables)<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          //MultiTableHFileOutputFormat use case<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        if (LOG.isDebugEnabled()) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.510"></a>
+<span class="sourceLineNo">511</span>                  (fullKey) + "]");<a name="line.511"></a>
 <span class="sourceLineNo">512</span>        }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>        if (LOG.isDebugEnabled()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.514"></a>
-<span class="sourceLineNo">515</span>                  (fullKey) + "]");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    return ret;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>  /**<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  @SuppressWarnings("deprecation")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (startKeys.isEmpty()) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      throw new IllegalArgumentException("No regions passed");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    // We're generating a list of split points, and we don't ever<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // empty reducer with index 0<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    ImmutableBytesWritable first = sorted.first();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    if (writeMultipleTables) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.542"></a>
-<span class="sourceLineNo">543</span>              ().get()));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      throw new IllegalArgumentException(<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "First region of table should have empty start key. Instead has: "<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          + Bytes.toStringBinary(first.get()));<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    sorted.remove(sorted.first());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>    // Write the actual file<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      NullWritable.class);<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>    try {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        writer.append(startKey, NullWritable.get());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      writer.close();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  /**<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * table. This<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * &lt;ul&gt;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * &lt;/ul&gt;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * running this function.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * table. This<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * &lt;ul&gt;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * &lt;/ul&gt;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * running this function.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
-<span class="sourceLineNo">600</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      RegionLocator regionLocator) throws IOException {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Configuration conf = job.getConfiguration();<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    job.setOutputFormatClass(cls);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    boolean writeMultipleTables = false;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      writeMultipleTables = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // sort the incoming values.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      job.setReducerClass(CellSortReducer.class);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      job.setReducerClass(PutSortReducer.class);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      job.setReducerClass(TextSortReducer.class);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    } else {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
+<span class="sourceLineNo">513</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return ret;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>  /**<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  @SuppressWarnings("deprecation")<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    if (startKeys.isEmpty()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      throw new IllegalArgumentException("No regions passed");<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    // We're generating a list of split points, and we don't ever<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    // empty reducer with index 0<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    ImmutableBytesWritable first = sorted.first();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    if (writeMultipleTables) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              ().get()));<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    }<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      throw new IllegalArgumentException(<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          "First region of table should have empty start key. Instead has: "<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          + Bytes.toStringBinary(first.get()));<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    sorted.remove(sorted.first());<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Write the actual file<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      NullWritable.class);<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>    try {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        writer.append(startKey, NullWritable.get());<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    } finally {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      writer.close();<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">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>  /**<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   * table. This<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   * &lt;ul&gt;<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>   * &lt;/ul&gt;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   * running this function.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   */<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      throws IOException {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>  }<a name="line.580"></a>
+<span class="sourceLineNo">581</span><a name="line.581"></a>
+<span class="sourceLineNo">582</span>  /**<a name="line.582"></a>
+<span class="sourceLineNo">583</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * table. This<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * &lt;ul&gt;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * &lt;/ul&gt;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * running this function.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   */<a name="line.595"></a>
+<span class="sourceLineNo">596</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      RegionLocator regionLocator) throws IOException {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    Configuration conf = job.getConfiguration();<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    job.setOutputFormatClass(cls);<a name="line.608"></a>
+<span class="sourceLineNo">609</span><a name="line.609"></a>
+<span class="sourceLineNo">610</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    boolean writeMultipleTables = false;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      writeMultipleTables = true;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // sort the incoming values.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      job.setReducerClass(CellSortReducer.class);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      job.setReducerClass(PutSortReducer.class);<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      job.setReducerClass(TextSortReducer.class);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    } else {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        CellSerialization.class.getName());<a name="line.634"></a>
 <span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        CellSerialization.class.getName());<a name="line.638"></a>
+<span class="sourceLineNo">636</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
 <span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    /* Now get the region start keys for every table required */<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      String tn = writeMultipleTables?<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      allTableNames.add(tn);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.659"></a>
-<span class="sourceLineNo">660</span>            .toString(tableSeparator)));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    // Use table's region boundaries for TOP split points.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        "to match current region count for all tables");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    job.setNumReduceTasks(startKeys.size());<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    // Set compression algorithms based on column families<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.670"></a>
+<span class="sourceLineNo">640</span>    /* Now get the region start keys for every table required */<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      String tn = writeMultipleTables?<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.649"></a>
+<span class="sourceLineNo">650</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      allTableNames.add(tn);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>            .toString(tableSeparator)));<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    // Use table's region boundaries for TOP split points.<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        "to match current region count for all tables");<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    job.setNumReduceTasks(startKeys.size());<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    // Set compression algorithms based on column families<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.666"></a>
+<span class="sourceLineNo">667</span>            tableDescriptors));<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            tableDescriptors));<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.670"></a>
 <span class="sourceLineNo">671</span>            tableDescriptors));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>            tableDescriptors));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            tableDescriptors));<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        tableDescriptors));<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.678"></a>
-<span class="sourceLineNo">679</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    TableMapReduceUtil.initCredentials(job);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">672</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        tableDescriptors));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.674"></a>
+<span class="sourceLineNo">675</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    TableMapReduceUtil.initCredentials(job);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.679"></a>
+<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
+<span class="sourceLineNo">681</span><a name="line.681"></a>
+<span class="sourceLineNo">682</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      IOException {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    Configuration conf = job.getConfiguration();<a name="line.684"></a>
 <span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      IOException {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    Configuration conf = job.getConfiguration();<a name="line.688"></a>
+<span class="sourceLineNo">686</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // Set compression algorithms based on column families<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.708"></a>
-<span class="sourceLineNo">709</span><a name="line.709"></a>
-<span class="sourceLineNo">710</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    TableMapReduceUtil.initCredentials(job);<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.712"></a>
-<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>  /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   * map from the configuration.<a name="line.717"></a>
-<span class="sourceLineNo">718</span>   *<a name="line.718"></a>
-<span class="sourceLineNo">719</span>   * @param conf to read the serialized values from<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * @return a map from column family to the configured compression algorithm<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  @VisibleForTesting<a name="line.722"></a>
-<span class="sourceLineNo">723</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return compressionMap;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  /**<a name="line.735"></a>
-<span class="sourceLineNo">736</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.736"></a>
-<span class="sourceLineNo">737</span>   * map from the configuration.<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   *<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * @param conf to read the serialized values from<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   * @return a map from column family to the the configured bloom filter type<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  @VisibleForTesting<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    return bloomTypeMap;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   * map from the configuration.<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   *<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @param conf to read the serialized values from<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   * @return a map from column family to the the configured bloom filter param<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   */<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  @VisibleForTesting<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>  /**<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * Runs inside the task to deserialize column family to block size<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * map from the configuration.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   *<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   * @param conf to read the serialized values from<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @return a map from column family to the configured block size<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   */<a name="line.773"></a>
-<span class="sourceLineNo">774</span>  @VisibleForTesting<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    return blockSizeMap;<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   * type map from the configuration.<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   *<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * @param conf to read the serialized values from<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   *         configured data block type for the family<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   */<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  @VisibleForTesting<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    return encoderMap;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   *<a name="line.809"></a>
-<span class="sourceLineNo">810</span>   * @param conf to read the serialized values from<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * @param confName conf key to read from the configuration<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @return a map of column family to the given configuration value<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      Configuration conf, String confName) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    String confVal = conf.get(confName, "");<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      String[] familySplit = familyConf.split("=");<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      if (familySplit.length != 2) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>        continue;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      }<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.824"></a>
-<span class="sourceLineNo">825</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      } catch (UnsupportedEncodingException e) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        // will not happen with UTF-8 encoding<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        throw new AssertionError(e);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return confValMap;<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   */<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          writeMultipleTables)<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      throws IOException {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    Configuration conf = job.getConfiguration();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    // create the partitions file<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    FileSystem fs = FileSystem.get(conf);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    String hbaseTmpFsDir =<a name="line.844"></a>
-<span class="sourceLineNo">845</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    fs.makeQualified(partitionsPath);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    fs.deleteOnExit(partitionsPath);<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>    // configure job to use it<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>  }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.857"></a>
-<span class="sourceLineNo">858</span>  @VisibleForTesting<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      throws UnsupportedEncodingException {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int i = 0;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      if (tableDescriptor == null) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        // could happen with mock table instance<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        return "";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        if (i++ &gt; 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          attributeValue.append('&amp;');<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(<a name="line.873"></a>
-<span class="sourceLineNo">874</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.874"></a>
-<span class="sourceLineNo">875</span>            "UTF-8"));<a name="line.875"></a>
-<span class="sourceLineNo">876</span>        attributeValue.append('=');<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    // Get rid of the last ampersand<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    return attributeValue.toString();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  }<a name="line.882"></a>
-<span class="sourceLineNo">883</span><a name="line.883"></a>
-<span class="sourceLineNo">884</span>  /**<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * Invoked while configuring the MR job for incremental load.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  @VisibleForTesting<a name="line.888"></a>
-<span class="sourceLineNo">889</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>          familyDescriptor.getCompressionType().getName();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>  /**<a name="line.892"></a>
-<span class="sourceLineNo">893</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * configuring the MR job for incremental load.<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   */<a name="line.895"></a>
-<span class="sourceLineNo">896</span>  @VisibleForTesting<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   * configuring the MR job for incremental load.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   */<a name="line.903"></a>
-<span class="sourceLineNo">904</span>  @VisibleForTesting<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    if (bloomType == null) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    return bloomType;<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  };<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * configuring the MR job for incremental load.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   */<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  @VisibleForTesting<a name="line.917"></a>
-<span class="sourceLineNo">918</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    String bloomParam = "";<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    return bloomParam;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>  };<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>  /**<a name="line.927"></a>
-<span class="sourceLineNo">928</span>   * Serialize column family to data block encoding map to configuration.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * Invoked while configuring the MR job for incremental load.<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  @VisibleForTesting<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (encoding == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      encoding = DataBlockEncoding.NONE;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return encoding.toString();<a name="line.937"></a>
-<span class="sourceLineNo">938</span>  };<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>}<a name="line.940"></a>
+<span class="sourceLineNo">690</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    // Set compression algorithms based on column families<a name="line.694"></a>
+<span class="sourceLineNo">695</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.699"></a>
+<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.704"></a>
+<span class="sourceLineNo">705</span><a name="line.705"></a>
+<span class="sourceLineNo">706</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    TableMapReduceUtil.initCredentials(job);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   * map from the configuration.<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   *<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * @param conf to read the serialized values from<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * @return a map from column family to the configured compression algorithm<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
+<span class="sourceLineNo">718</span>  @VisibleForTesting<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.721"></a>
+<span class="sourceLineNo">722</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    return compressionMap;<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>  /**<a name="line.731"></a>
+<span class="sourceLineNo">732</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.732"></a>
+<span class="sourceLineNo">733</span>   * map from the configuration.<a name="line.733"></a>
+<span class="sourceLineNo">734</span>   *<a name="line.734"></a>
+<span class="sourceLineNo">735</span>   * @param conf to read the serialized values from<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * @return a map from column family to the the configured bloom filter type<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   */<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  @VisibleForTesting<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    }<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    return bloomTypeMap;<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   * map from the configuration.<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   *<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @param conf to read the serialized values from<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * @return a map from column family to the the configured bloom filter param<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   */<a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @VisibleForTesting<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  /**<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * Runs inside the task to deserialize column family to block size<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * map from the configuration.<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   *<a name="line.766"></a>
+<span class="sourceLineNo">767</span>   * @param conf to read the serialized values from<a name="line.767"></a>
+<span class="sourceLineNo">768</span>   * @return a map from column family to the configured block size<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   */<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  @VisibleForTesting<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.772"></a>
+<span class="sourceLineNo">773</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    return blockSizeMap;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  /**<a name="line.782"></a>
+<span class="sourceLineNo">783</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.783"></a>
+<span class="sourceLineNo">784</span>   * type map from the configuration.<a name="line.784"></a>
+<span class="sourceLineNo">785</span>   *<a name="line.785"></a>
+<span class="sourceLineNo">786</span>   * @param conf to read the serialized values from<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   *         configured data block type for the family<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   */<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  @VisibleForTesting<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    }<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return encoderMap;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span><a name="line.802"></a>
+<span class="sourceLineNo">803</span>  /**<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   *<a name="line.805"></a>
+<span class="sourceLineNo">806</span>   * @param conf to read the serialized values from<a name="line.806"></a>
+<span class="sourceLineNo">807</span>   * @param confName conf key to read from the configuration<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   * @return a map of column family to the given configuration value<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      Configuration conf, String confName) {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    String confVal = conf.get(confName, "");<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      String[] familySplit = familyConf.split("=");<a name="line.815"></a>
+<span class="sourceLineNo">816</span>      if (familySplit.length != 2) {<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        continue;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      }<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      } catch (UnsupportedEncodingException e) {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        // will not happen with UTF-8 encoding<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        throw new AssertionError(e);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    return confValMap;<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  }<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>  /**<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   */<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.834"></a>
+<span class="sourceLineNo">835</span>          writeMultipleTables)<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      throws IOException {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    Configuration conf = job.getConfiguration();<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    // create the partitions file<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    FileSystem fs = FileSystem.get(conf);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    String hbaseTmpFsDir =<a name="line.840"></a>
+<span class="sourceLineNo">841</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    fs.makeQualified(partitionsPath);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    fs.deleteOnExit(partitionsPath);<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    // configure job to use it<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.853"></a>
+<span class="sourceLineNo">854</span>  @VisibleForTesting<a name="line.854"></a>
+<span class="sourceLineNo">855</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      throws UnsupportedEncodingException {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    int i = 0;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      if (tableDescriptor == null) {<a name="line.860"></a>
+<span class="sourceLineNo">861</span>        // could happen with mock table instance<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        return "";<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      }<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>        if (i++ &gt; 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>          attributeValue.append('&amp;');<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        attributeValue.append(URLEncoder.encode(<a name="line.869"></a>
+<span class="sourceLineNo">870</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.870"></a>
+<span class="sourceLineNo">871</span>            "UTF-8"));<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        attributeValue.append('=');<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      }<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    // Get rid of the last ampersand<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    return attributeValue.toString();<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * Invoked while configuring the MR job for incremental load.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  @VisibleForTesting<a name="line.884"></a>
+<span class="sourceLineNo">885</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>          familyDescriptor.getCompressionType().getName();<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.889"></a>
+<span class="sourceLineNo">890</span>   * configuring the MR job for incremental load.<a name="line.890"></a>
+<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
+<span class="sourceLineNo">892</span>  @VisibleForTesting<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.893"></a>
+<span class="sourceLineNo">894</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.894"></a>
+<span class="sourceLineNo">895</span><a name="line.895"></a>
+<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * configuring the MR job for incremental load.<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   */<a name="line.899"></a>
+<span class="sourceLineNo">900</span>  @VisibleForTesting<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    if (bloomType == null) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    return bloomType;<a name="line.906"></a>
+<span class="sourceLineNo">907</span>  };<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>  /**<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   * configuring the MR job for incremental load.<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   */<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  @VisibleForTesting<a name="line.913"></a>
+<span class="sourceLineNo">914</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    String bloomParam = "";<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    }<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    return bloomParam;<a name="line.920"></a>
+<span class="sourceLineNo">921</span>  };<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>  /**<a name="line.923"></a>
+<span class="sourceLineNo">924</span>   * Serialize column family to data block encoding map to configuration.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>   * Invoked while configuring the MR job for incremental load.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>   */<a name="line.926"></a>
+<span class="sourceLineNo">927</span>  @VisibleForTesting<a name="line.927"></a>
+<span class="sourceLineNo">928</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    if (encoding == null) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      encoding = DataBlockEncoding.NONE;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    }<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    return encoding.toString();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>  };<a name="line.934"></a>
+<span class="sourceLineNo">935</span><a name="line.935"></a>
+<span class="sourceLineNo">936</span>}<a name="line.936"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
index 3a09c42..6379267 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
@@ -243,9 +243,9 @@
 <span class="sourceLineNo">235</span>      // Map of families to writers and how much has been output on the writer.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>      private final Map&lt;byte[], WriterLength&gt; writers =<a name="line.236"></a>
 <span class="sourceLineNo">237</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      private byte[] previousRow = HConstants.EMPTY_BYTE_ARRAY;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      private boolean rollRequested = false;<a name="line.240"></a>
+<span class="sourceLineNo">238</span>      private final Map&lt;byte[], byte[]&gt; previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
 <span class="sourceLineNo">242</span>      @Override<a name="line.242"></a>
 <span class="sourceLineNo">243</span>      public void write(ImmutableBytesWritable row, V cell)<a name="line.243"></a>
@@ -294,658 +294,654 @@
 <span class="sourceLineNo">286</span>          configureStoragePolicy(conf, fs, tableAndFamily, writerPath);<a name="line.286"></a>
 <span class="sourceLineNo">287</span>        }<a name="line.287"></a>
 <span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          this.rollRequested = true;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>        // This can only happen once a row is finished though<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        if (rollRequested &amp;&amp; Bytes.compareTo(this.previousRow, rowKey) != 0) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          rollWriters(wl);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        // create a new WAL writer, if necessary<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        if (wl == null || wl.writer == null) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            HRegionLocation loc = null;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>            if (tableName != null) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>                     RegionLocator locator =<a name="line.305"></a>
-<span class="sourceLineNo">306</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>                loc = locator.getRegionLocation(rowKey);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>              } catch (Throwable e) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.309"></a>
-<span class="sourceLineNo">310</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                loc = null;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>              } }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>            if (null == loc) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>              if (LOG.isTraceEnabled()) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.316"></a>
-<span class="sourceLineNo">317</span>                  Bytes.toString(rowKey));<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>            } else {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>              if (LOG.isDebugEnabled()) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>              }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>              InetSocketAddress initialIsa =<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.325"></a>
-<span class="sourceLineNo">326</span>              if (initialIsa.isUnresolved()) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>                if (LOG.isTraceEnabled()) {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.328"></a>
-<span class="sourceLineNo">329</span>                      + loc.getPort() + ", so use default writer");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>              } else {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>                if (LOG.isDebugEnabled()) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<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>          } else {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>        // we now have the proper WAL writer. full steam ahead<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        wl.writer.append(kv);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        wl.written += length;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>        // Copy the row so we know when a row transition.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        this.previousRow = rowKey;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        String[] tableNameParts = tableName.split(":");<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        if (tableNameParts.length &gt; 1) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        return tableRelPath;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        if (writerLength != null) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          closeWriter(writerLength);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          for (WriterLength wl : this.writers.values()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            closeWriter(wl);<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>        this.rollRequested = false;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        if (wl.writer != null) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          LOG.info(<a name="line.376"></a>
-<span class="sourceLineNo">377</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          close(wl.writer);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        wl.writer = null;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        wl.written = 0;<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>       * Create a new StoreFile.Writer.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>       * @param family<a name="line.386"></a>
-<span class="sourceLineNo">387</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>       * @throws IOException<a name="line.388"></a>
-<span class="sourceLineNo">389</span>       */<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          justification="Not important")<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.392"></a>
-<span class="sourceLineNo">393</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        if (writeMultipleTables) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          familydir = new Path(outputDir,<a name="line.397"></a>
-<span class="sourceLineNo">398</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        WriterLength wl = new WriterLength();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        Algorithm compression = overriddenCompression;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        compression = compression == null ? defaultCompression : compression;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                                    .withCompression(compression)<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                                    .withBlockSize(blockSize);<a name="line.419"></a>
+<span class="sourceLineNo">289</span>        // This can only happen once a row is finished though<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span>                &amp;&amp; Bytes.compareTo(this.previousRows.get(family), rowKey) != 0) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          rollWriters(wl);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>        // create a new WAL writer, if necessary<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (wl == null || wl.writer == null) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            HRegionLocation loc = null;<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>            if (tableName != null) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>                     RegionLocator locator =<a name="line.302"></a>
+<span class="sourceLineNo">303</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                loc = locator.getRegionLocation(rowKey);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>              } catch (Throwable e) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.306"></a>
+<span class="sourceLineNo">307</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>                loc = null;<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>            if (null == loc) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>              if (LOG.isTraceEnabled()) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.313"></a>
+<span class="sourceLineNo">314</span>                  Bytes.toString(rowKey));<a name="line.314"></a>
+<span class="sourceLineNo">315</span>              }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            } else {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>              if (LOG.isDebugEnabled()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>              }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              InetSocketAddress initialIsa =<a name="line.321"></a>
+<span class="sourceLineNo">322</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>              if (initialIsa.isUnresolved()) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>                if (LOG.isTraceEnabled()) {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.325"></a>
+<span class="sourceLineNo">326</span>                      + loc.getPort() + ", so use default writer");<a name="line.326"></a>
+<span class="sourceLineNo">327</span>                }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>              } else {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>                if (LOG.isDebugEnabled()) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.331"></a>
+<span class="sourceLineNo">332</span>                }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<a name="line.333"></a>
+<span class="sourceLineNo">334</span>                });<a name="line.334"></a>
+<span class="sourceLineNo">335</span>              }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>            }<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          } else {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<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>        // we now have the proper WAL writer. full steam ahead<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        wl.writer.append(kv);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        wl.written += length;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>        // Copy the row so we know when a row transition.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        this.previousRows.put(family, rowKey);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        String[] tableNameParts = tableName.split(":");<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        if (tableNameParts.length &gt; 1) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        return tableRelPath;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      }<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        if (writerLength != null) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          closeWriter(writerLength);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        } else {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          for (WriterLength wl : this.writers.values()) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>            closeWriter(wl);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        if (wl.writer != null) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          LOG.info(<a name="line.372"></a>
+<span class="sourceLineNo">373</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          close(wl.writer);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        wl.writer = null;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        wl.written = 0;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      /*<a name="line.380"></a>
+<span class="sourceLineNo">381</span>       * Create a new StoreFile.Writer.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>       * @param family<a name="line.382"></a>
+<span class="sourceLineNo">383</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>       * @throws IOException<a name="line.384"></a>
+<span class="sourceLineNo">385</span>       */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          justification="Not important")<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.388"></a>
+<span class="sourceLineNo">389</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        if (writeMultipleTables) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          familydir = new Path(outputDir,<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        WriterLength wl = new WriterLength();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        Algorithm compression = overriddenCompression;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        compression = compression == null ? defaultCompression : compression;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        }<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                                    .withCompression(compression)<a name="line.412"></a>
+<span class="sourceLineNo">413</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.413"></a>
+<span class="sourceLineNo">414</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.414"></a>
+<span class="sourceLineNo">415</span>                                    .withBlockSize(blockSize);<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          contextBuilder.withIncludesTags(true);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          contextBuilder.withIncludesTags(true);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        if (null == favoredNodes) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          wl.writer =<a name="line.428"></a>
-<span class="sourceLineNo">429</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        } else {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          wl.writer =<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.434"></a>
-<span class="sourceLineNo">435</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>                  .withFavoredNodes(favoredNodes).build();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">421</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        if (null == favoredNodes) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          wl.writer =<a name="line.424"></a>
+<span class="sourceLineNo">425</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>        } else {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          wl.writer =<a name="line.429"></a>
+<span class="sourceLineNo">430</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  .withFavoredNodes(favoredNodes).build();<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>        this.writers.put(tableAndFamily, wl);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        return wl;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
 <span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>        this.writers.put(tableAndFamily, wl);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return wl;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (w != null) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.446"></a>
-<span class="sourceLineNo">447</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.447"></a>
-<span class="sourceLineNo">448</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>              Bytes.toBytes(true));<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.452"></a>
-<span class="sourceLineNo">453</span>              Bytes.toBytes(compactionExclude));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          w.appendTrackedTimestampsToMetadata();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          w.close();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      @Override<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      public void close(TaskAttemptContext c)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException, InterruptedException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        for (WriterLength wl: this.writers.values()) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          close(wl.writer);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    };<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>  /**<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * Configure block storage policy for CF after the directory is created.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   */<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      return;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    String policy =<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  /*<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  static class WriterLength {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    long written = 0;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    StoreFileWriter writer = null;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  }<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>   * Return the start keys of all of the regions in this table,<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * as a list of ImmutableBytesWritable.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                                                                 boolean writeMultipleTables)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          throws IOException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      TableName tableName = regionLocator.getName();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      for (byte[] byteKey : byteKeys) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (writeMultipleTables)<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          //MultiTableHFileOutputFormat use case<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.511"></a>
+<span class="sourceLineNo">440</span>      private void close(final StoreFileWriter w) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        if (w != null) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>              Bytes.toBytes(true));<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>              Bytes.toBytes(compactionExclude));<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          w.appendTrackedTimestampsToMetadata();<a name="line.450"></a>
+<span class="sourceLineNo">451</span>          w.close();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>      @Override<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      public void close(TaskAttemptContext c)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException, InterruptedException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        for (WriterLength wl: this.writers.values()) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          close(wl.writer);<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>    };<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>  /**<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * Configure block storage policy for CF after the directory is created.<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      return;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>    String policy =<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.475"></a>
+<span class="sourceLineNo">476</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>  }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>  /*<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   */<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  static class WriterLength {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    long written = 0;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    StoreFileWriter writer = null;<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  /**<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   * Return the start keys of all of the regions in this table,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * as a list of ImmutableBytesWritable.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   */<a name="line.491"></a>
+<span class="sourceLineNo">492</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>                                                                 boolean writeMultipleTables)<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          throws IOException {<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      TableName tableName = regionLocator.getName();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      for (byte[] byteKey : byteKeys) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        if (writeMultipleTables)<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          //MultiTableHFileOutputFormat use case<a name="line.506"></a>
+<span class="sourceLineNo">507</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        if (LOG.isDebugEnabled()) {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.510"></a>
+<span class="sourceLineNo">511</span>                  (fullKey) + "]");<a name="line.511"></a>
 <span class="sourceLineNo">512</span>        }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>        if (LOG.isDebugEnabled()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.514"></a>
-<span class="sourceLineNo">515</span>                  (fullKey) + "]");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    return ret;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>  /**<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  @SuppressWarnings("deprecation")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    if (startKeys.isEmpty()) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      throw new IllegalArgumentException("No regions passed");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    // We're generating a list of split points, and we don't ever<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // empty reducer with index 0<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    ImmutableBytesWritable first = sorted.first();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    if (writeMultipleTables) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.542"></a>
-<span class="sourceLineNo">543</span>              ().get()));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      throw new IllegalArgumentException(<a name="line.546"></a>
-<span class="sourceLineNo">547</span>          "First region of table should have empty start key. Instead has: "<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          + Bytes.toStringBinary(first.get()));<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    sorted.remove(sorted.first());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>    // Write the actual file<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      NullWritable.class);<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>    try {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        writer.append(startKey, NullWritable.get());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      writer.close();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  /**<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * table. This<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * &lt;ul&gt;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * &lt;/ul&gt;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * running this function.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      throws IOException {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * table. This<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * &lt;ul&gt;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * &lt;/ul&gt;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * running this function.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
-<span class="sourceLineNo">600</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      RegionLocator regionLocator) throws IOException {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    Configuration conf = job.getConfiguration();<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    job.setOutputFormatClass(cls);<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    boolean writeMultipleTables = false;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      writeMultipleTables = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // sort the incoming values.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      job.setReducerClass(CellSortReducer.class);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      job.setReducerClass(PutSortReducer.class);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      job.setReducerClass(TextSortReducer.class);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    } else {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
+<span class="sourceLineNo">513</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      }<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    }<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return ret;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>  }<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>  /**<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  @SuppressWarnings("deprecation")<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    if (startKeys.isEmpty()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      throw new IllegalArgumentException("No regions passed");<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    // We're generating a list of split points, and we don't ever<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    // empty reducer with index 0<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    ImmutableBytesWritable first = sorted.first();<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    if (writeMultipleTables) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.538"></a>
+<span class="sourceLineNo">539</span>              ().get()));<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    }<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      throw new IllegalArgumentException(<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          "First region of table should have empty start key. Instead has: "<a name="line.543"></a>
+<span class="sourceLineNo">544</span>          + Bytes.toStringBinary(first.get()));<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    }<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    sorted.remove(sorted.first());<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>    // Write the actual file<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      NullWritable.class);<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>    try {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        writer.append(startKey, NullWritable.get());<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    } finally {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      writer.close();<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">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>  /**<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   * table. This<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   * &lt;ul&gt;<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.569"></a>
+<span class="sourceLineNo">570</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>   * &lt;/ul&gt;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   * running this function.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   */<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      throws IOException {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>  }<a name="line.580"></a>
+<span class="sourceLineNo">581</span><a name="line.581"></a>
+<span class="sourceLineNo">582</span>  /**<a name="line.582"></a>
+<span class="sourceLineNo">583</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * table. This<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * &lt;ul&gt;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   * &lt;/ul&gt;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   * running this function.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   */<a name="line.595"></a>
+<span class="sourceLineNo">596</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      RegionLocator regionLocator) throws IOException {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    Configuration conf = job.getConfiguration();<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    job.setOutputFormatClass(cls);<a name="line.608"></a>
+<span class="sourceLineNo">609</span><a name="line.609"></a>
+<span class="sourceLineNo">610</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    boolean writeMultipleTables = false;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      writeMultipleTables = true;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // sort the incoming values.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      job.setReducerClass(CellSortReducer.class);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      job.setReducerClass(PutSortReducer.class);<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      job.setReducerClass(TextSortReducer.class);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    } else {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        CellSerialization.class.getName());<a name="line.634"></a>
 <span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        CellSerialization.class.getName());<a name="line.638"></a>
+<span class="sourceLineNo">636</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
 <span class="sourceLineNo">639</span><a name="line.639"></a>
-<span class="sourceLineNo">640</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>    /* Now get the region start keys for every table required */<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      String tn = writeMultipleTables?<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      allTableNames.add(tn);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.659"></a>
-<span class="sourceLineNo">660</span>            .toString(tableSeparator)));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    // Use table's region boundaries for TOP split points.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        "to match current region count for all tables");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    job.setNumReduceTasks(startKeys.size());<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    // Set compression algorithms based on column families<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.670"></a>
+<span class="sourceLineNo">640</span>    /* Now get the region start keys for every table required */<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      String tn = writeMultipleTables?<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.649"></a>
+<span class="sourceLineNo">650</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      allTableNames.add(tn);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>            .toString(tableSeparator)));<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    // Use table's region boundaries for TOP split points.<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.659"></a>
+<span class="sourceLineNo">660</span>        "to match current region count for all tables");<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    job.setNumReduceTasks(startKeys.size());<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    // Set compression algorithms based on column families<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.666"></a>
+<span class="sourceLineNo">667</span>            tableDescriptors));<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.668"></a>
+<span class="sourceLineNo">669</span>            tableDescriptors));<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.670"></a>
 <span class="sourceLineNo">671</span>            tableDescriptors));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.672"></a>
-<span class="sourceLineNo">673</span>            tableDescriptors));<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            tableDescriptors));<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        tableDescriptors));<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.678"></a>
-<span class="sourceLineNo">679</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    TableMapReduceUtil.initCredentials(job);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
+<span class="sourceLineNo">672</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        tableDescriptors));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.674"></a>
+<span class="sourceLineNo">675</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    TableMapReduceUtil.initCredentials(job);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.679"></a>
+<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
+<span class="sourceLineNo">681</span><a name="line.681"></a>
+<span class="sourceLineNo">682</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      IOException {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    Configuration conf = job.getConfiguration();<a name="line.684"></a>
 <span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      IOException {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    Configuration conf = job.getConfiguration();<a name="line.688"></a>
+<span class="sourceLineNo">686</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // Set compression algorithms based on column families<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.708"></a>
-<span class="sourceLineNo">709</span><a name="line.709"></a>
-<span class="sourceLineNo">710</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    TableMapReduceUtil.initCredentials(job);<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.712"></a>
-<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>  /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   * map from the configuration.<a name="line.717"></a>
-<span class="sourceLineNo">718</span>   *<a name="line.718"></a>
-<span class="sourceLineNo">719</span>   * @param conf to read the serialized values from<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * @return a map from column family to the configured compression algorithm<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  @VisibleForTesting<a name="line.722"></a>
-<span class="sourceLineNo">723</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return compressionMap;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  /**<a name="line.735"></a>
-<span class="sourceLineNo">736</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.736"></a>
-<span class="sourceLineNo">737</span>   * map from the configuration.<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   *<a name="line.738"></a>
-<span class="sourceLineNo">739</span>   * @param conf to read the serialized values from<a name="line.739"></a>
-<span class="sourceLineNo">740</span>   * @return a map from column family to the the configured bloom filter type<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  @VisibleForTesting<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    return bloomTypeMap;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   * map from the configuration.<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   *<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   * @param conf to read the serialized values from<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   * @return a map from column family to the the configured bloom filter param<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   */<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  @VisibleForTesting<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span><a name="line.766"></a>
-<span class="sourceLineNo">767</span>  /**<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * Runs inside the task to deserialize column family to block size<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * map from the configuration.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   *<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   * @param conf to read the serialized values from<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @return a map from column family to the configured block size<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   */<a name="line.773"></a>
-<span class="sourceLineNo">774</span>  @VisibleForTesting<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    return blockSizeMap;<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
-<span class="sourceLineNo">785</span><a name="line.785"></a>
-<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   * type map from the configuration.<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   *<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * @param conf to read the serialized values from<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   *         configured data block type for the family<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   */<a name="line.793"></a>
-<span class="sourceLineNo">794</span>  @VisibleForTesting<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    return encoderMap;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   *<a name="line.809"></a>
-<span class="sourceLineNo">810</span>   * @param conf to read the serialized values from<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * @param confName conf key to read from the configuration<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @return a map of column family to the given configuration value<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      Configuration conf, String confName) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    String confVal = conf.get(confName, "");<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      String[] familySplit = familyConf.split("=");<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      if (familySplit.length != 2) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>        continue;<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      }<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.824"></a>
-<span class="sourceLineNo">825</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      } catch (UnsupportedEncodingException e) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>        // will not happen with UTF-8 encoding<a name="line.827"></a>
-<span class="sourceLineNo">828</span>        throw new AssertionError(e);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return confValMap;<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   */<a name="line.837"></a>
-<span class="sourceLineNo">838</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.838"></a>
-<span class="sourceLineNo">839</span>          writeMultipleTables)<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      throws IOException {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    Configuration conf = job.getConfiguration();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    // create the partitions file<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    FileSystem fs = FileSystem.get(conf);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    String hbaseTmpFsDir =<a name="line.844"></a>
-<span class="sourceLineNo">845</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.845"></a>
-<span class="sourceLineNo">846</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    fs.makeQualified(partitionsPath);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    fs.deleteOnExit(partitionsPath);<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>    // configure job to use it<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>  }<a name="line.855"></a>
-<span class="sourceLineNo">856</span><a name="line.856"></a>
-<span class="sourceLineNo">857</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.857"></a>
-<span class="sourceLineNo">858</span>  @VisibleForTesting<a name="line.858"></a>
-<span class="sourceLineNo">859</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      throws UnsupportedEncodingException {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    int i = 0;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      if (tableDescriptor == null) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>        // could happen with mock table instance<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        return "";<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        if (i++ &gt; 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          attributeValue.append('&amp;');<a name="line.871"></a>
-<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(<a name="line.873"></a>
-<span class="sourceLineNo">874</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.874"></a>
-<span class="sourceLineNo">875</span>            "UTF-8"));<a name="line.875"></a>
-<span class="sourceLineNo">876</span>        attributeValue.append('=');<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    // Get rid of the last ampersand<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    return attributeValue.toString();<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  }<a name="line.882"></a>
-<span class="sourceLineNo">883</span><a name="line.883"></a>
-<span class="sourceLineNo">884</span>  /**<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * Invoked while configuring the MR job for incremental load.<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   */<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  @VisibleForTesting<a name="line.888"></a>
-<span class="sourceLineNo">889</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.889"></a>
-<span class="sourceLineNo">890</span>          familyDescriptor.getCompressionType().getName();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>  /**<a name="line.892"></a>
-<span class="sourceLineNo">893</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * configuring the MR job for incremental load.<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   */<a name="line.895"></a>
-<span class="sourceLineNo">896</span>  @VisibleForTesting<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.897"></a>
-<span class="sourceLineNo">898</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   * configuring the MR job for incremental load.<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   */<a name="line.903"></a>
-<span class="sourceLineNo">904</span>  @VisibleForTesting<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    if (bloomType == null) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    return bloomType;<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  };<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * configuring the MR job for incremental load.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   */<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  @VisibleForTesting<a name="line.917"></a>
-<span class="sourceLineNo">918</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    String bloomParam = "";<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    return bloomParam;<a name="line.924"></a>
-<span class="sourceLineNo">925</span>  };<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>  /**<a name="line.927"></a>
-<span class="sourceLineNo">928</span>   * Serialize column family to data block encoding map to configuration.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * Invoked while configuring the MR job for incremental load.<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   */<a name="line.930"></a>
-<span class="sourceLineNo">931</span>  @VisibleForTesting<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    if (encoding == null) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      encoding = DataBlockEncoding.NONE;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    return encoding.toString();<a name="line.937"></a>
-<span class="sourceLineNo">938</span>  };<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>}<a name="line.940"></a>
+<span class="sourceLineNo">690</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    // Set compression algorithms based on column families<a name="line.694"></a>
+<span class="sourceLineNo">695</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.695"></a>
+<span class="sourceLineNo">696</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.697"></a>
+<span class="sourceLineNo">698</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.699"></a>
+<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.704"></a>
+<span class="sourceLineNo">705</span><a name="line.705"></a>
+<span class="sourceLineNo">706</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    TableMapReduceUtil.initCredentials(job);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   * map from the configuration.<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   *<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * @param conf to read the serialized values from<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * @return a map from column family to the configured compression algorithm<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
+<span class="sourceLineNo">718</span>  @VisibleForTesting<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.721"></a>
+<span class="sourceLineNo">722</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    return compressionMap;<a name="line.728"></a>
+<span class="sourceLineNo">729</span>  }<a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>  /**<a name="line.731"></a>
+<span class="sourceLineNo">732</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.732"></a>
+<span class="sourceLineNo">733</span>   * map from the configuration.<a name="line.733"></a>
+<span class="sourceLineNo">734</span>   *<a name="line.734"></a>
+<span class="sourceLineNo">735</span>   * @param conf to read the serialized values from<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * @return a map from column family to the the configured bloom filter type<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   */<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  @VisibleForTesting<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    }<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    return bloomTypeMap;<a name="line.747"></a>
+<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>  /**<a name="line.750"></a>
+<span class="sourceLineNo">751</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   * map from the configuration.<a name="line.752"></a>
+<span class="sourceLineNo">753</span>   *<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   * @param conf to read the serialized values from<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * @return a map from column family to the the configured bloom filter param<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   */<a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @VisibleForTesting<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>  /**<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * Runs inside the task to deserialize column family to block size<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * map from the configuration.<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   *<a name="line.766"></a>
+<span class="sourceLineNo">767</span>   * @param conf to read the serialized values from<a name="line.767"></a>
+<span class="sourceLineNo">768</span>   * @return a map from column family to the configured block size<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   */<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  @VisibleForTesting<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.772"></a>
+<span class="sourceLineNo">773</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    }<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    return blockSizeMap;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>  /**<a name="line.782"></a>
+<span class="sourceLineNo">783</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.783"></a>
+<span class="sourceLineNo">784</span>   * type map from the configuration.<a name="line.784"></a>
+<span class="sourceLineNo">785</span>   *<a name="line.785"></a>
+<span class="sourceLineNo">786</span>   * @param conf to read the serialized values from<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   *         configured data block type for the family<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   */<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  @VisibleForTesting<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    }<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return encoderMap;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span><a name="line.802"></a>
+<span class="sourceLineNo">803</span>  /**<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   *<a name="line.805"></a>
+<span class="sourceLineNo">806</span>   * @param conf to read the serialized values from<a name="line.806"></a>
+<span class="sourceLineNo">807</span>   * @param confName conf key to read from the configuration<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   * @return a map of column family to the given configuration value<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      Configuration conf, String confName) {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    String confVal = conf.get(confName, "");<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      String[] familySplit = familyConf.split("=");<a name="line.815"></a>
+<span class="sourceLineNo">816</span>      if (familySplit.length != 2) {<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        continue;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      }<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.820"></a>
+<span class="sourceLineNo">821</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      } catch (UnsupportedEncodingException e) {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        // will not happen with UTF-8 encoding<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        throw new AssertionError(e);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    return confValMap;<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  }<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>  /**<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   */<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.834"></a>
+<span class="sourceLineNo">835</span>          writeMultipleTables)<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      throws IOException {<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    Configuration conf = job.getConfiguration();<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    // create the partitions file<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    FileSystem fs = FileSystem.get(conf);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    String hbaseTmpFsDir =<a name="line.840"></a>
+<span class="sourceLineNo">841</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.841"></a>
+<span class="sourceLineNo">842</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    fs.makeQualified(partitionsPath);<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    fs.deleteOnExit(partitionsPath);<a name="line.846"></a>
+<span class="sourceLineNo">847</span><a name="line.847"></a>
+<span class="sourceLineNo">848</span>    // configure job to use it<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.853"></a>
+<span class="sourceLineNo">854</span>  @VisibleForTesting<a name="line.854"></a>
+<span class="sourceLineNo">855</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.855"></a>
+<span class="sourceLineNo">856</span>      throws UnsupportedEncodingException {<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    int i = 0;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      if (tableDescriptor == null) {<a name="line.860"></a>
+<span class="sourceLineNo">861</span>        // could happen with mock table instance<a name="line.861"></a>
+<span class="sourceLineNo">862</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.862"></a>
+<span class="sourceLineNo">863</span>        return "";<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      }<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>        if (i++ &gt; 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>          attributeValue.append('&amp;');<a name="line.867"></a>
+<span class="sourceLineNo">868</span>        }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        attributeValue.append(URLEncoder.encode(<a name="line.869"></a>
+<span class="sourceLineNo">870</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.870"></a>
+<span class="sourceLineNo">871</span>            "UTF-8"));<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        attributeValue.append('=');<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      }<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    }<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    // Get rid of the last ampersand<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    return attributeValue.toString();<a name="line.877"></a>
+<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
+<span class="sourceLineNo">879</span><a name="line.879"></a>
+<span class="sourceLineNo">880</span>  /**<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   * Invoked while configuring the MR job for incremental load.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   */<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  @VisibleForTesting<a name="line.884"></a>
+<span class="sourceLineNo">885</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>          familyDescriptor.getCompressionType().getName();<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  /**<a name="line.888"></a>
+<span class="sourceLineNo">889</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.889"></a>
+<span class="sourceLineNo">890</span>   * configuring the MR job for incremental load.<a name="line.890"></a>
+<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
+<span class="sourceLineNo">892</span>  @VisibleForTesting<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.893"></a>
+<span class="sourceLineNo">894</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.894"></a>
+<span class="sourceLineNo">895</span><a name="line.895"></a>
+<span class="sourceLineNo">896</span>  /**<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * configuring the MR job for incremental load.<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   */<a name="line.899"></a>
+<span class="sourceLineNo">900</span>  @VisibleForTesting<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    if (bloomType == null) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    return bloomType;<a name="line.906"></a>
+<span class="sourceLineNo">907</span>  };<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>  /**<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   * configuring the MR job for incremental load.<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   */<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  @VisibleForTesting<a name="line.913"></a>
+<span class="sourceLineNo">914</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    String bloomParam = "";<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    }<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    return bloomParam;<a name="line.920"></a>
+<span class="sourceLineNo">921</span>  };<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>  /**<a name="line.923"></a>
+<span class="sourceLineNo">924</span>   * Serialize column family to data block encoding map to configuration.<a name="line.924"></a>
+<span class="sourceLineNo">925</span>   * Invoked while configuring the MR job for incremental load.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>   */<a name="line.926"></a>
+<span class="sourceLineNo">927</span>  @VisibleForTesting<a name="line.927"></a>
+<span class="sourceLineNo">928</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    if (encoding == null) {<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      encoding = DataBlockEncoding.NONE;<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    }<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    return encoding.toString();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>  };<a name="line.934"></a>
+<span class="sourceLineNo">935</span><a name="line.935"></a>
+<span class="sourceLineNo">936</span>}<a name="line.936"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index fc1a285..9c1cfea 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -822,247 +822,248 @@
 <span class="sourceLineNo">814</span>      org.apache.hadoop.hbase.mapreduce.TableMapper.class,           // hbase-server<a name="line.814"></a>
 <span class="sourceLineNo">815</span>      org.apache.hadoop.hbase.metrics.impl.FastLongHistogram.class,  // hbase-metrics<a name="line.815"></a>
 <span class="sourceLineNo">816</span>      org.apache.hadoop.hbase.metrics.Snapshot.class,                // hbase-metrics-api<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      org.apache.zookeeper.ZooKeeper.class,<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      org.apache.hbase.thirdparty.io.netty.channel.Channel.class,<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      com.google.protobuf.Message.class,<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.class,<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      org.apache.hbase.thirdparty.com.google.common.collect.Lists.class,<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      org.apache.htrace.core.Tracer.class,<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      com.codahale.metrics.MetricRegistry.class,<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      org.apache.commons.lang3.ArrayUtils.class,<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      org.apache.hbase.thirdparty.com.google.gson.Gson.class,<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      org.apache.hadoop.hbase.zookeeper.ZKWatcher.class);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  /**<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   * Returns a classpath string built from the content of the "tmpjars" value in {@code conf}.<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   * Also exposed to shell scripts via `bin/hbase mapredcp`.<a name="line.831"></a>
-<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
-<span class="sourceLineNo">833</span>  public static String buildDependencyClasspath(Configuration conf) {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    if (conf == null) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      throw new IllegalArgumentException("Must provide a configuration object.");<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    Set&lt;String&gt; paths = new HashSet&lt;&gt;(conf.getStringCollection("tmpjars"));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    if (paths.isEmpty()) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      throw new IllegalArgumentException("Configuration contains no tmpjars.");<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    StringBuilder sb = new StringBuilder();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    for (String s : paths) {<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      // entries can take the form 'file:/path/to/file.jar'.<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      int idx = s.indexOf(":");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      if (idx != -1) s = s.substring(idx + 1);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      if (sb.length() &gt; 0) sb.append(File.pathSeparator);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>      sb.append(s);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    }<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return sb.toString();<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>  /**<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * Add the HBase dependency jars as well as jars for any of the configured<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * job classes to the job configuration, so that JobClient will ship them<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   * to the cluster and add them to the DistributedCache.<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   */<a name="line.856"></a>
-<span class="sourceLineNo">857</span>  public static void addDependencyJars(Job job) throws IOException {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    addHBaseDependencyJars(job.getConfiguration());<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    try {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      addDependencyJarsForClasses(job.getConfiguration(),<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          // when making changes here, consider also mapred.TableMapReduceUtil<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          // pull job classes<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          job.getMapOutputKeyClass(),<a name="line.863"></a>
-<span class="sourceLineNo">864</span>          job.getMapOutputValueClass(),<a name="line.864"></a>
-<span class="sourceLineNo">865</span>          job.getInputFormatClass(),<a name="line.865"></a>
-<span class="sourceLineNo">866</span>          job.getOutputKeyClass(),<a name="line.866"></a>
-<span class="sourceLineNo">867</span>          job.getOutputValueClass(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          job.getOutputFormatClass(),<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          job.getPartitionerClass(),<a name="line.869"></a>
-<span class="sourceLineNo">870</span>          job.getCombinerClass());<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    } catch (ClassNotFoundException e) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      throw new IOException(e);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span>  }<a name="line.874"></a>
-<span class="sourceLineNo">875</span><a name="line.875"></a>
-<span class="sourceLineNo">876</span>  /**<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * Add the jars containing the given classes to the job's configuration<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   * the DistributedCache.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * @deprecated since 1.3.0 and will be removed in 3.0.0. Use {@link #addDependencyJars(Job)}<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   *   instead.<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   * @see #addDependencyJars(Job)<a name="line.882"></a>
-<span class="sourceLineNo">883</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-8386"&gt;HBASE-8386&lt;/a&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   */<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  @Deprecated<a name="line.885"></a>
-<span class="sourceLineNo">886</span>  public static void addDependencyJars(Configuration conf,<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    LOG.warn("The addDependencyJars(Configuration, Class&lt;?&gt;...) method has been deprecated since it"<a name="line.888"></a>
-<span class="sourceLineNo">889</span>             + " is easy to use incorrectly. Most users should rely on addDependencyJars(Job) " +<a name="line.889"></a>
-<span class="sourceLineNo">890</span>             "instead. See HBASE-8386 for more details.");<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    addDependencyJarsForClasses(conf, classes);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  }<a name="line.892"></a>
-<span class="sourceLineNo">893</span><a name="line.893"></a>
-<span class="sourceLineNo">894</span>  /**<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   * Add the jars containing the given classes to the job's configuration<a name="line.895"></a>
-<span class="sourceLineNo">896</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.896"></a>
-<span class="sourceLineNo">897</span>   * the DistributedCache.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>   *<a name="line.898"></a>
-<span class="sourceLineNo">899</span>   * N.B. that this method at most adds one jar per class given. If there is more than one<a name="line.899"></a>
-<span class="sourceLineNo">900</span>   * jar available containing a class with the same name as a given class, we don't define<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * which of those jars might be chosen.<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   *<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   * @param conf The Hadoop Configuration to modify<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * @param classes will add just those dependencies needed to find the given classes<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @throws IOException if an underlying library call fails.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  @InterfaceAudience.Private<a name="line.907"></a>
-<span class="sourceLineNo">908</span>  public static void addDependencyJarsForClasses(Configuration conf,<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    FileSystem localFs = FileSystem.getLocal(conf);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    Set&lt;String&gt; jars = new HashSet&lt;&gt;();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // Add jars that are already in the tmpjars variable<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    jars.addAll(conf.getStringCollection("tmpjars"));<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>    // add jars as we find them to a map of contents jar name so that we can avoid<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    // creating new jars for classes that have already been packaged.<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    Map&lt;String, String&gt; packagedClasses = new HashMap&lt;&gt;();<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>    // Add jars containing the specified classes<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    for (Class&lt;?&gt; clazz : classes) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      if (clazz == null) continue;<a name="line.922"></a>
-<span class="sourceLineNo">923</span><a name="line.923"></a>
-<span class="sourceLineNo">924</span>      Path path = findOrCreateJar(clazz, localFs, packagedClasses);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      if (path == null) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        LOG.warn("Could not find jar for class " + clazz +<a name="line.926"></a>
-<span class="sourceLineNo">927</span>                 " in order to ship it to the cluster.");<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        continue;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      if (!localFs.exists(path)) {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>        LOG.warn("Could not validate jar file " + path + " for class "<a name="line.931"></a>
-<span class="sourceLineNo">932</span>                 + clazz);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>        continue;<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      jars.add(path.toString());<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    if (jars.isEmpty()) return;<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>    conf.set("tmpjars", StringUtils.arrayToString(jars.toArray(new String[jars.size()])));<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  }<a name="line.940"></a>
-<span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>  /**<a name="line.942"></a>
-<span class="sourceLineNo">943</span>   * Finds the Jar for a class or creates it if it doesn't exist. If the class is in<a name="line.943"></a>
-<span class="sourceLineNo">944</span>   * a directory in the classpath, it creates a Jar on the fly with the<a name="line.944"></a>
-<span class="sourceLineNo">945</span>   * contents of the directory and returns the path to that Jar. If a Jar is<a name="line.945"></a>
-<span class="sourceLineNo">946</span>   * created, it is created in the system temporary directory. Otherwise,<a name="line.946"></a>
-<span class="sourceLineNo">947</span>   * returns an existing jar that contains a class of the same name. Maintains<a name="line.947"></a>
-<span class="sourceLineNo">948</span>   * a mapping from jar contents to the tmp jar created.<a name="line.948"></a>
-<span class="sourceLineNo">949</span>   * @param my_class the class to find.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>   * @param fs the FileSystem with which to qualify the returned path.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>   * @param packagedClasses a map of class name to path.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>   * @return a jar file that contains the class.<a name="line.952"></a>
-<span class="sourceLineNo">953</span>   * @throws IOException<a name="line.953"></a>
-<span class="sourceLineNo">954</span>   */<a name="line.954"></a>
-<span class="sourceLineNo">955</span>  private static Path findOrCreateJar(Class&lt;?&gt; my_class, FileSystem fs,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>      Map&lt;String, String&gt; packagedClasses)<a name="line.956"></a>
-<span class="sourceLineNo">957</span>  throws IOException {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // attempt to locate an existing jar for the class.<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    String jar = findContainingJar(my_class, packagedClasses);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (null == jar || jar.isEmpty()) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      jar = getJar(my_class);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      updateMap(jar, packagedClasses);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    }<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>    if (null == jar || jar.isEmpty()) {<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      return null;<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
-<span class="sourceLineNo">968</span><a name="line.968"></a>
-<span class="sourceLineNo">969</span>    LOG.debug(String.format("For class %s, using jar %s", my_class.getName(), jar));<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    return new Path(jar).makeQualified(fs.getUri(), fs.getWorkingDirectory());<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  /**<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * Add entries to &lt;code&gt;packagedClasses&lt;/code&gt; corresponding to class files<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * contained in &lt;code&gt;jar&lt;/code&gt;.<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param jar The jar who's content to list.<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param packagedClasses map[class -&gt; jar]<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
-<span class="sourceLineNo">979</span>  private static void updateMap(String jar, Map&lt;String, String&gt; packagedClasses) throws IOException {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    if (null == jar || jar.isEmpty()) {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      return;<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    }<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    ZipFile zip = null;<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    try {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      zip = new ZipFile(jar);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      for (Enumeration&lt;? extends ZipEntry&gt; iter = zip.entries(); iter.hasMoreElements();) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>        ZipEntry entry = iter.nextElement();<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        if (entry.getName().endsWith("class")) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>          packagedClasses.put(entry.getName(), jar);<a name="line.989"></a>
-<span class="sourceLineNo">990</span>        }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    } finally {<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      if (null != zip) zip.close();<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    }<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  }<a name="line.995"></a>
-<span class="sourceLineNo">996</span><a name="line.996"></a>
-<span class="sourceLineNo">997</span>  /**<a name="line.997"></a>
-<span class="sourceLineNo">998</span>   * Find a jar that contains a class of the same name, if any. It will return<a name="line.998"></a>
-<span class="sourceLineNo">999</span>   * a jar file, even if that is not the first thing on the class path that<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>   * has a class with the same name. Looks first on the classpath and then in<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * the &lt;code&gt;packagedClasses&lt;/code&gt; map.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * @param my_class the class to find.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @return a jar file that contains the class, or null.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @throws IOException<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  private static String findContainingJar(Class&lt;?&gt; my_class, Map&lt;String, String&gt; packagedClasses)<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      throws IOException {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    ClassLoader loader = my_class.getClassLoader();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    String class_file = my_class.getName().replaceAll("\\.", "/") + ".class";<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    if (loader != null) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      // first search the classpath<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      for (Enumeration&lt;URL&gt; itr = loader.getResources(class_file); itr.hasMoreElements();) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        URL url = itr.nextElement();<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        if ("jar".equals(url.getProtocol())) {<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>          String toReturn = url.getPath();<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          if (toReturn.startsWith("file:")) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>            toReturn = toReturn.substring("file:".length());<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          // URLDecoder is a misnamed class, since it actually decodes<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>          // x-www-form-urlencoded MIME type rather than actual<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          // URL encoding (which the file path has). Therefore it would<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          // decode +s to ' 's which is incorrect (spaces are actually<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>          // either unencoded or encoded as "%20"). Replace +s first, so<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          // that they are kept sacred during the decoding process.<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>          toReturn = toReturn.replaceAll("\\+", "%2B");<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>          toReturn = URLDecoder.decode(toReturn, "UTF-8");<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>          return toReturn.replaceAll("!.*$", "");<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>        }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      }<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    }<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span><a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    // now look in any jars we've packaged using JarFinder. Returns null when<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    // no jar is found.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    return packagedClasses.get(class_file);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>  }<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span><a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>  /**<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   * Invoke 'getJar' on a custom JarFinder implementation. Useful for some job<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * configuration contexts (HBASE-8140) and also for testing on MRv2.<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * check if we have HADOOP-9426.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @param my_class the class to find.<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   * @return a jar file that contains the class, or null.<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>   */<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>  private static String getJar(Class&lt;?&gt; my_class) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    String ret = null;<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    try {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      ret = JarFinder.getJar(my_class);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    } catch (Exception e) {<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>      // toss all other exceptions, related to reflection failure<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>      throw new RuntimeException("getJar invocation failed.", e);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    return ret;<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>  }<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>}<a name="line.1057"></a>
+<span class="sourceLineNo">817</span>      org.apache.hbase.thirdparty.com.google.gson.GsonBuilder.class, // hbase-shaded-gson<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      org.apache.zookeeper.ZooKeeper.class,<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      org.apache.hbase.thirdparty.io.netty.channel.Channel.class,<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      com.google.protobuf.Message.class,<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.class,<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      org.apache.hbase.thirdparty.com.google.common.collect.Lists.class,<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      org.apache.htrace.core.Tracer.class,<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      com.codahale.metrics.MetricRegistry.class,<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      org.apache.commons.lang3.ArrayUtils.class,<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      org.apache.hbase.thirdparty.com.google.gson.Gson.class,<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      org.apache.hadoop.hbase.zookeeper.ZKWatcher.class);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  }<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>  /**<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * Returns a classpath string built from the content of the "tmpjars" value in {@code conf}.<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Also exposed to shell scripts via `bin/hbase mapredcp`.<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   */<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  public static String buildDependencyClasspath(Configuration conf) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    if (conf == null) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      throw new IllegalArgumentException("Must provide a configuration object.");<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    Set&lt;String&gt; paths = new HashSet&lt;&gt;(conf.getStringCollection("tmpjars"));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    if (paths.isEmpty()) {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      throw new IllegalArgumentException("Configuration contains no tmpjars.");<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    StringBuilder sb = new StringBuilder();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    for (String s : paths) {<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      // entries can take the form 'file:/path/to/file.jar'.<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      int idx = s.indexOf(":");<a name="line.845"></a>
+<span class="sourceLineNo">846</span>      if (idx != -1) s = s.substring(idx + 1);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      if (sb.length() &gt; 0) sb.append(File.pathSeparator);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>      sb.append(s);<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    return sb.toString();<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Add the HBase dependency jars as well as jars for any of the configured<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * job classes to the job configuration, so that JobClient will ship them<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * to the cluster and add them to the DistributedCache.<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   */<a name="line.857"></a>
+<span class="sourceLineNo">858</span>  public static void addDependencyJars(Job job) throws IOException {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    addHBaseDependencyJars(job.getConfiguration());<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    try {<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      addDependencyJarsForClasses(job.getConfiguration(),<a name="line.861"></a>
+<span class="sourceLineNo">862</span>          // when making changes here, consider also mapred.TableMapReduceUtil<a name="line.862"></a>
+<span class="sourceLineNo">863</span>          // pull job classes<a name="line.863"></a>
+<span class="sourceLineNo">864</span>          job.getMapOutputKeyClass(),<a name="line.864"></a>
+<span class="sourceLineNo">865</span>          job.getMapOutputValueClass(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>          job.getInputFormatClass(),<a name="line.866"></a>
+<span class="sourceLineNo">867</span>          job.getOutputKeyClass(),<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          job.getOutputValueClass(),<a name="line.868"></a>
+<span class="sourceLineNo">869</span>          job.getOutputFormatClass(),<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          job.getPartitionerClass(),<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          job.getCombinerClass());<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    } catch (ClassNotFoundException e) {<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      throw new IOException(e);<a name="line.873"></a>
+<span class="sourceLineNo">874</span>    }<a name="line.874"></a>
+<span class="sourceLineNo">875</span>  }<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>  /**<a name="line.877"></a>
+<span class="sourceLineNo">878</span>   * Add the jars containing the given classes to the job's configuration<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.879"></a>
+<span class="sourceLineNo">880</span>   * the DistributedCache.<a name="line.880"></a>
+<span class="sourceLineNo">881</span>   * @deprecated since 1.3.0 and will be removed in 3.0.0. Use {@link #addDependencyJars(Job)}<a name="line.881"></a>
+<span class="sourceLineNo">882</span>   *   instead.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>   * @see #addDependencyJars(Job)<a name="line.883"></a>
+<span class="sourceLineNo">884</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-8386"&gt;HBASE-8386&lt;/a&gt;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>   */<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  @Deprecated<a name="line.886"></a>
+<span class="sourceLineNo">887</span>  public static void addDependencyJars(Configuration conf,<a name="line.887"></a>
+<span class="sourceLineNo">888</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    LOG.warn("The addDependencyJars(Configuration, Class&lt;?&gt;...) method has been deprecated since it"<a name="line.889"></a>
+<span class="sourceLineNo">890</span>             + " is easy to use incorrectly. Most users should rely on addDependencyJars(Job) " +<a name="line.890"></a>
+<span class="sourceLineNo">891</span>             "instead. See HBASE-8386 for more details.");<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    addDependencyJarsForClasses(conf, classes);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  }<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>  /**<a name="line.895"></a>
+<span class="sourceLineNo">896</span>   * Add the jars containing the given classes to the job's configuration<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * the DistributedCache.<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   *<a name="line.899"></a>
+<span class="sourceLineNo">900</span>   * N.B. that this method at most adds one jar per class given. If there is more than one<a name="line.900"></a>
+<span class="sourceLineNo">901</span>   * jar available containing a class with the same name as a given class, we don't define<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * which of those jars might be chosen.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   *<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   * @param conf The Hadoop Configuration to modify<a name="line.904"></a>
+<span class="sourceLineNo">905</span>   * @param classes will add just those dependencies needed to find the given classes<a name="line.905"></a>
+<span class="sourceLineNo">906</span>   * @throws IOException if an underlying library call fails.<a name="line.906"></a>
+<span class="sourceLineNo">907</span>   */<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  @InterfaceAudience.Private<a name="line.908"></a>
+<span class="sourceLineNo">909</span>  public static void addDependencyJarsForClasses(Configuration conf,<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.910"></a>
+<span class="sourceLineNo">911</span><a name="line.911"></a>
+<span class="sourceLineNo">912</span>    FileSystem localFs = FileSystem.getLocal(conf);<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    Set&lt;String&gt; jars = new HashSet&lt;&gt;();<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    // Add jars that are already in the tmpjars variable<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    jars.addAll(conf.getStringCollection("tmpjars"));<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>    // add jars as we find them to a map of contents jar name so that we can avoid<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    // creating new jars for classes that have already been packaged.<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    Map&lt;String, String&gt; packagedClasses = new HashMap&lt;&gt;();<a name="line.919"></a>
+<span class="sourceLineNo">920</span><a name="line.920"></a>
+<span class="sourceLineNo">921</span>    // Add jars containing the specified classes<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    for (Class&lt;?&gt; clazz : classes) {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      if (clazz == null) continue;<a name="line.923"></a>
+<span class="sourceLineNo">924</span><a name="line.924"></a>
+<span class="sourceLineNo">925</span>      Path path = findOrCreateJar(clazz, localFs, packagedClasses);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      if (path == null) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        LOG.warn("Could not find jar for class " + clazz +<a name="line.927"></a>
+<span class="sourceLineNo">928</span>                 " in order to ship it to the cluster.");<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        continue;<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      if (!localFs.exists(path)) {<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        LOG.warn("Could not validate jar file " + path + " for class "<a name="line.932"></a>
+<span class="sourceLineNo">933</span>                 + clazz);<a name="line.933"></a>
+<span class="sourceLineNo">934</span>        continue;<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      }<a name="line.935"></a>
+<span class="sourceLineNo">936</span>      jars.add(path.toString());<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    }<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    if (jars.isEmpty()) return;<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>    conf.set("tmpjars", StringUtils.arrayToString(jars.toArray(new String[jars.size()])));<a name="line.940"></a>
+<span class="sourceLineNo">941</span>  }<a name="line.941"></a>
+<span class="sourceLineNo">942</span><a name="line.942"></a>
+<span class="sourceLineNo">943</span>  /**<a name="line.943"></a>
+<span class="sourceLineNo">944</span>   * Finds the Jar for a class or creates it if it doesn't exist. If the class is in<a name="line.944"></a>
+<span class="sourceLineNo">945</span>   * a directory in the classpath, it creates a Jar on the fly with the<a name="line.945"></a>
+<span class="sourceLineNo">946</span>   * contents of the directory and returns the path to that Jar. If a Jar is<a name="line.946"></a>
+<span class="sourceLineNo">947</span>   * created, it is created in the system temporary directory. Otherwise,<a name="line.947"></a>
+<span class="sourceLineNo">948</span>   * returns an existing jar that contains a class of the same name. Maintains<a name="line.948"></a>
+<span class="sourceLineNo">949</span>   * a mapping from jar contents to the tmp jar created.<a name="line.949"></a>
+<span class="sourceLineNo">950</span>   * @param my_class the class to find.<a name="line.950"></a>
+<span class="sourceLineNo">951</span>   * @param fs the FileSystem with which to qualify the returned path.<a name="line.951"></a>
+<span class="sourceLineNo">952</span>   * @param packagedClasses a map of class name to path.<a name="line.952"></a>
+<span class="sourceLineNo">953</span>   * @return a jar file that contains the class.<a name="line.953"></a>
+<span class="sourceLineNo">954</span>   * @throws IOException<a name="line.954"></a>
+<span class="sourceLineNo">955</span>   */<a name="line.955"></a>
+<span class="sourceLineNo">956</span>  private static Path findOrCreateJar(Class&lt;?&gt; my_class, FileSystem fs,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>      Map&lt;String, String&gt; packagedClasses)<a name="line.957"></a>
+<span class="sourceLineNo">958</span>  throws IOException {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>    // attempt to locate an existing jar for the class.<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    String jar = findContainingJar(my_class, packagedClasses);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    if (null == jar || jar.isEmpty()) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      jar = getJar(my_class);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      updateMap(jar, packagedClasses);<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>    if (null == jar || jar.isEmpty()) {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      return null;<a name="line.967"></a>
+<span class="sourceLineNo">968</span>    }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>    LOG.debug(String.format("For class %s, using jar %s", my_class.getName(), jar));<a name="line.970"></a>
+<span class="sourceLineNo">971</span>    return new Path(jar).makeQualified(fs.getUri(), fs.getWorkingDirectory());<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  }<a name="line.972"></a>
+<span class="sourceLineNo">973</span><a name="line.973"></a>
+<span class="sourceLineNo">974</span>  /**<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * Add entries to &lt;code&gt;packagedClasses&lt;/code&gt; corresponding to class files<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * contained in &lt;code&gt;jar&lt;/code&gt;.<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param jar The jar who's content to list.<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   * @param packagedClasses map[class -&gt; jar]<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   */<a name="line.979"></a>
+<span class="sourceLineNo">980</span>  private static void updateMap(String jar, Map&lt;String, String&gt; packagedClasses) throws IOException {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (null == jar || jar.isEmpty()) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span>    ZipFile zip = null;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>    try {<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      zip = new ZipFile(jar);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      for (Enumeration&lt;? extends ZipEntry&gt; iter = zip.entries(); iter.hasMoreElements();) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        ZipEntry entry = iter.nextElement();<a name="line.988"></a>
+<span class="sourceLineNo">989</span>        if (entry.getName().endsWith("class")) {<a name="line.989"></a>
+<span class="sourceLineNo">990</span>          packagedClasses.put(entry.getName(), jar);<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    } finally {<a name="line.993"></a>
+<span class="sourceLineNo">994</span>      if (null != zip) zip.close();<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    }<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
+<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">998</span>  /**<a name="line.998"></a>
+<span class="sourceLineNo">999</span>   * Find a jar that contains a class of the same name, if any. It will return<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>   * a jar file, even if that is not the first thing on the class path that<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>   * has a class with the same name. Looks first on the classpath and then in<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>   * the &lt;code&gt;packagedClasses&lt;/code&gt; map.<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>   * @param my_class the class to find.<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>   * @return a jar file that contains the class, or null.<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>   * @throws IOException<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>   */<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>  private static String findContainingJar(Class&lt;?&gt; my_class, Map&lt;String, String&gt; packagedClasses)<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>      throws IOException {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    ClassLoader loader = my_class.getClassLoader();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span><a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    String class_file = my_class.getName().replaceAll("\\.", "/") + ".class";<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    if (loader != null) {<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      // first search the classpath<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      for (Enumeration&lt;URL&gt; itr = loader.getResources(class_file); itr.hasMoreElements();) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        URL url = itr.nextElement();<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        if ("jar".equals(url.getProtocol())) {<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>          String toReturn = url.getPath();<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>          if (toReturn.startsWith("file:")) {<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>            toReturn = toReturn.substring("file:".length());<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>          }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          // URLDecoder is a misnamed class, since it actually decodes<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>          // x-www-form-urlencoded MIME type rather than actual<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>          // URL encoding (which the file path has). Therefore it would<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          // decode +s to ' 's which is incorrect (spaces are actually<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          // either unencoded or encoded as "%20"). Replace +s first, so<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>          // that they are kept sacred during the decoding process.<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          toReturn = toReturn.replaceAll("\\+", "%2B");<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          toReturn = URLDecoder.decode(toReturn, "UTF-8");<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          return toReturn.replaceAll("!.*$", "");<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>        }<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      }<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span><a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>    // now look in any jars we've packaged using JarFinder. Returns null when<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>    // no jar is found.<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    return packagedClasses.get(class_file);<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>  }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span><a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>  /**<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>   * Invoke 'getJar' on a custom JarFinder implementation. Useful for some job<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>   * configuration contexts (HBASE-8140) and also for testing on MRv2.<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>   * check if we have HADOOP-9426.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>   * @param my_class the class to find.<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>   * @return a jar file that contains the class, or null.<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>   */<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>  private static String getJar(Class&lt;?&gt; my_class) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>    String ret = null;<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    try {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>      ret = JarFinder.getJar(my_class);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    } catch (Exception e) {<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      // toss all other exceptions, related to reflection failure<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>      throw new RuntimeException("getJar invocation failed.", e);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    return ret;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  }<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>}<a name="line.1058"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.DeadServerMetricRegionChore.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.DeadServerMetricRegionChore.html
index b020d1a..13b124b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.DeadServerMetricRegionChore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.DeadServerMetricRegionChore.html
@@ -1973,167 +1973,188 @@
 <span class="sourceLineNo">1965</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1965"></a>
 <span class="sourceLineNo">1966</span>          ", allServersCount=" + servers.size());<a name="line.1966"></a>
 <span class="sourceLineNo">1967</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    }<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span><a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>      final List&lt;ServerName&gt; servers) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    if (isTraceEnabled) {<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    final LoadBalancer balancer = getBalancer();<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>    // ask the balancer where to place regions<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>      if (isTraceEnabled) {<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      }<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>      try {<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      } catch (HBaseIOException e) {<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>        LOG.warn("unable to retain assignment", e);<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      }<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    }<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span><a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    if (!hris.isEmpty()) {<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>      if (isTraceEnabled) {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        LOG.trace("round robin regions=" + hris);<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>      try {<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      } catch (HBaseIOException e) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        addToPendingAssignment(regions, hris);<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    }<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  }<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span><a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>    final long st = System.currentTimeMillis();<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span><a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    if (plan == null) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    }<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span><a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    if (plan.isEmpty()) return;<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span><a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    int evcount = 0;<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>      final ServerName server = entry.getKey();<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>        regionNode.setRegionLocation(server);<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>      }<a name="line.2030"></a>
+<span class="sourceLineNo">1968</span>          serversForSysTables.isEmpty() &amp;&amp; !containsBogusAssignments(regions, systemHRIs) ?<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>              servers: serversForSysTables);<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>    }<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span><a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>  }<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span><a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  private boolean containsBogusAssignments(Map&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      List&lt;RegionInfo&gt; hirs) {<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    for (RegionInfo ri : hirs) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>      if (regions.get(ri).getRegionLocation() != null &amp;&amp;<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>          regions.get(ri).getRegionLocation().equals(LoadBalancer.BOGUS_SERVER_NAME)){<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>        return true;<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>      }<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>    }<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    return false;<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>  }<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span><a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final List&lt;ServerName&gt; servers) {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    if (isTraceEnabled) {<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    final LoadBalancer balancer = getBalancer();<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    // ask the balancer where to place regions<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>      if (isTraceEnabled) {<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>      }<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      try {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>      } catch (HBaseIOException e) {<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        LOG.warn("unable to retain assignment", e);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>      }<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>    }<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span><a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>    // TODO: Do we need to split retain and round-robin?<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    if (!hris.isEmpty()) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      if (isTraceEnabled) {<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>        LOG.trace("round robin regions=" + hris);<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>      try {<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>      } catch (HBaseIOException e) {<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>        addToPendingAssignment(regions, hris);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>  }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>    final long st = System.currentTimeMillis();<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>    if (plan == null) {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.2030"></a>
 <span class="sourceLineNo">2031</span>    }<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    final long et = System.currentTimeMillis();<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    if (LOG.isTraceEnabled()) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>          StringUtils.humanTimeDiff(et - st));<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    assignQueueLock.lock();<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    try {<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>      for (RegionInfo hri: pendingRegions) {<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      }<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    } finally {<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>      assignQueueLock.unlock();<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>    }<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>  }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>  /**<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * For system tables, we must assign them to a server with highest version.<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    // RegionServerInfo that includes Version.<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        .stream()<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>        .collect(Collectors.toList());<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>    if (serverList.isEmpty()) {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      return Collections.emptyList();<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>    }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    String highestVersion = Collections.max(serverList,<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    return serverList.stream()<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>        .map(Pair::getFirst)<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        .collect(Collectors.toList());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  }<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span><a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>  @VisibleForTesting<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  MasterServices getMaster() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return master;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * @return a snapshot of rsReports<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   */<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>  public Map&lt;ServerName, Set&lt;byte[]&gt;&gt; getRSReports() {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    Map&lt;ServerName, Set&lt;byte[]&gt;&gt; rsReportsSnapshot = new HashMap&lt;&gt;();<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    synchronized (rsReports) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>      rsReports.entrySet().forEach(e -&gt; rsReportsSnapshot.put(e.getKey(), e.getValue()));<a name="line.2087"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    if (plan.isEmpty()) return;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span><a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    int evcount = 0;<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      final ServerName server = entry.getKey();<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>        regionNode.setRegionLocation(server);<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>        if (server.equals(LoadBalancer.BOGUS_SERVER_NAME) &amp;&amp; regionNode.isSystemTable()) {<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>          assignQueueLock.lock();<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>          try {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>            pendingAssignQueue.add(regionNode);<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>          } finally {<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>            assignQueueLock.unlock();<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>          }<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>        }else {<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>          events[evcount++] = regionNode.getProcedureEvent();<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        }<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    }<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    final long et = System.currentTimeMillis();<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    if (LOG.isTraceEnabled()) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>          StringUtils.humanTimeDiff(et - st));<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>    }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>  }<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span><a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    assignQueueLock.lock();<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    try {<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>      for (RegionInfo hri: pendingRegions) {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    } finally {<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>      assignQueueLock.unlock();<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span><a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>   * For system tables, we must assign them to a server with highest version.<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>   */<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    // RegionServerInfo that includes Version.<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>        .stream()<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>        .collect(Collectors.toList());<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    if (serverList.isEmpty()) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>      return Collections.emptyList();<a name="line.2087"></a>
 <span class="sourceLineNo">2088</span>    }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    return rsReportsSnapshot;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>  }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>  /**<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>   * Provide regions state count for given table.<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>   * e.g howmany regions of give table are opened/closed/rit etc<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>   *<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>   * @param tableName TableName<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>   * @return region states count<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>   */<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  public RegionStatesCount getRegionStatesCount(TableName tableName) {<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>    int openRegionsCount = 0;<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>    int closedRegionCount = 0;<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>    int ritCount = 0;<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>    int splitRegionCount = 0;<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    int totalRegionCount = 0;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    if (!isTableDisabled(tableName)) {<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>      final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      for (RegionState regionState : states) {<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>        if (regionState.isOpened()) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>          openRegionsCount++;<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        } else if (regionState.isClosed()) {<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>          closedRegionCount++;<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>        } else if (regionState.isSplit()) {<a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>          splitRegionCount++;<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>        }<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>      }<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>      totalRegionCount = states.size();<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      ritCount = totalRegionCount - openRegionsCount - splitRegionCount;<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    }<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>    return new RegionStatesCount.RegionStatesCountBuilder()<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      .setOpenRegions(openRegionsCount)<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      .setClosedRegions(closedRegionCount)<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>      .setSplitRegions(splitRegionCount)<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      .setRegionsInTransition(ritCount)<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>      .setTotalRegions(totalRegionCount)<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      .build();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>}<a name="line.2128"></a>
+<span class="sourceLineNo">2089</span>    String highestVersion = Collections.max(serverList,<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    return serverList.stream()<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        .map(Pair::getFirst)<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>        .collect(Collectors.toList());<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>  }<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span><a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>  @VisibleForTesting<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  MasterServices getMaster() {<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>    return master;<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  }<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span><a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  /**<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>   * @return a snapshot of rsReports<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>   */<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public Map&lt;ServerName, Set&lt;byte[]&gt;&gt; getRSReports() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    Map&lt;ServerName, Set&lt;byte[]&gt;&gt; rsReportsSnapshot = new HashMap&lt;&gt;();<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    synchronized (rsReports) {<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>      rsReports.entrySet().forEach(e -&gt; rsReportsSnapshot.put(e.getKey(), e.getValue()));<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>    }<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    return rsReportsSnapshot;<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span><a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>  /**<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>   * Provide regions state count for given table.<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>   * e.g howmany regions of give table are opened/closed/rit etc<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>   *<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>   * @param tableName TableName<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>   * @return region states count<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>   */<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>  public RegionStatesCount getRegionStatesCount(TableName tableName) {<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    int openRegionsCount = 0;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>    int closedRegionCount = 0;<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    int ritCount = 0;<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    int splitRegionCount = 0;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    int totalRegionCount = 0;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    if (!isTableDisabled(tableName)) {<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>      for (RegionState regionState : states) {<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        if (regionState.isOpened()) {<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>          openRegionsCount++;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>        } else if (regionState.isClosed()) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          closedRegionCount++;<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        } else if (regionState.isSplit()) {<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>          splitRegionCount++;<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        }<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>      }<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      totalRegionCount = states.size();<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>      ritCount = totalRegionCount - openRegionsCount - splitRegionCount;<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    return new RegionStatesCount.RegionStatesCountBuilder()<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      .setOpenRegions(openRegionsCount)<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      .setClosedRegions(closedRegionCount)<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      .setSplitRegions(splitRegionCount)<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      .setRegionsInTransition(ritCount)<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>      .setTotalRegions(totalRegionCount)<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>      .build();<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>}<a name="line.2149"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
index b020d1a..13b124b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionChore.html
@@ -1973,167 +1973,188 @@
 <span class="sourceLineNo">1965</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1965"></a>
 <span class="sourceLineNo">1966</span>          ", allServersCount=" + servers.size());<a name="line.1966"></a>
 <span class="sourceLineNo">1967</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    }<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span><a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>      final List&lt;ServerName&gt; servers) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    if (isTraceEnabled) {<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    final LoadBalancer balancer = getBalancer();<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>    // ask the balancer where to place regions<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>      if (isTraceEnabled) {<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      }<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>      try {<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      } catch (HBaseIOException e) {<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>        LOG.warn("unable to retain assignment", e);<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      }<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    }<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span><a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    if (!hris.isEmpty()) {<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>      if (isTraceEnabled) {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        LOG.trace("round robin regions=" + hris);<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>      try {<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      } catch (HBaseIOException e) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        addToPendingAssignment(regions, hris);<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    }<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  }<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span><a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>    final long st = System.currentTimeMillis();<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span><a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    if (plan == null) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    }<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span><a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    if (plan.isEmpty()) return;<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span><a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    int evcount = 0;<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>      final ServerName server = entry.getKey();<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>        regionNode.setRegionLocation(server);<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>      }<a name="line.2030"></a>
+<span class="sourceLineNo">1968</span>          serversForSysTables.isEmpty() &amp;&amp; !containsBogusAssignments(regions, systemHRIs) ?<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>              servers: serversForSysTables);<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>    }<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span><a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>  }<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span><a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  private boolean containsBogusAssignments(Map&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      List&lt;RegionInfo&gt; hirs) {<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    for (RegionInfo ri : hirs) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>      if (regions.get(ri).getRegionLocation() != null &amp;&amp;<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>          regions.get(ri).getRegionLocation().equals(LoadBalancer.BOGUS_SERVER_NAME)){<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>        return true;<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>      }<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>    }<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    return false;<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>  }<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span><a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final List&lt;ServerName&gt; servers) {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    if (isTraceEnabled) {<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    final LoadBalancer balancer = getBalancer();<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    // ask the balancer where to place regions<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>      if (isTraceEnabled) {<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>      }<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      try {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>      } catch (HBaseIOException e) {<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        LOG.warn("unable to retain assignment", e);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>      }<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>    }<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span><a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>    // TODO: Do we need to split retain and round-robin?<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    if (!hris.isEmpty()) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      if (isTraceEnabled) {<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>        LOG.trace("round robin regions=" + hris);<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>      try {<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>      } catch (HBaseIOException e) {<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>        addToPendingAssignment(regions, hris);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>  }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>    final long st = System.currentTimeMillis();<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>    if (plan == null) {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.2030"></a>
 <span class="sourceLineNo">2031</span>    }<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    final long et = System.currentTimeMillis();<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    if (LOG.isTraceEnabled()) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>          StringUtils.humanTimeDiff(et - st));<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    assignQueueLock.lock();<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    try {<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>      for (RegionInfo hri: pendingRegions) {<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      }<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    } finally {<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>      assignQueueLock.unlock();<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>    }<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>  }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>  /**<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * For system tables, we must assign them to a server with highest version.<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    // RegionServerInfo that includes Version.<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        .stream()<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>        .collect(Collectors.toList());<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>    if (serverList.isEmpty()) {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      return Collections.emptyList();<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>    }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    String highestVersion = Collections.max(serverList,<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    return serverList.stream()<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>        .map(Pair::getFirst)<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        .collect(Collectors.toList());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  }<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span><a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>  @VisibleForTesting<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  MasterServices getMaster() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return master;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * @return a snapshot of rsReports<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   */<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>  public Map&lt;ServerName, Set&lt;byte[]&gt;&gt; getRSReports() {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    Map&lt;ServerName, Set&lt;byte[]&gt;&gt; rsReportsSnapshot = new HashMap&lt;&gt;();<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    synchronized (rsReports) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>      rsReports.entrySet().forEach(e -&gt; rsReportsSnapshot.put(e.getKey(), e.getValue()));<a name="line.2087"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    if (plan.isEmpty()) return;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span><a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    int evcount = 0;<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      final ServerName server = entry.getKey();<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>        regionNode.setRegionLocation(server);<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>        if (server.equals(LoadBalancer.BOGUS_SERVER_NAME) &amp;&amp; regionNode.isSystemTable()) {<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>          assignQueueLock.lock();<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>          try {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>            pendingAssignQueue.add(regionNode);<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>          } finally {<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>            assignQueueLock.unlock();<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>          }<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>        }else {<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>          events[evcount++] = regionNode.getProcedureEvent();<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        }<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    }<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    final long et = System.currentTimeMillis();<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    if (LOG.isTraceEnabled()) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>          StringUtils.humanTimeDiff(et - st));<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>    }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>  }<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span><a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    assignQueueLock.lock();<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    try {<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>      for (RegionInfo hri: pendingRegions) {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    } finally {<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>      assignQueueLock.unlock();<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span><a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>   * For system tables, we must assign them to a server with highest version.<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>   */<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    // RegionServerInfo that includes Version.<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>        .stream()<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>        .collect(Collectors.toList());<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    if (serverList.isEmpty()) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>      return Collections.emptyList();<a name="line.2087"></a>
 <span class="sourceLineNo">2088</span>    }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    return rsReportsSnapshot;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>  }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>  /**<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>   * Provide regions state count for given table.<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>   * e.g howmany regions of give table are opened/closed/rit etc<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>   *<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>   * @param tableName TableName<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>   * @return region states count<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>   */<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  public RegionStatesCount getRegionStatesCount(TableName tableName) {<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>    int openRegionsCount = 0;<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>    int closedRegionCount = 0;<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>    int ritCount = 0;<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>    int splitRegionCount = 0;<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    int totalRegionCount = 0;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    if (!isTableDisabled(tableName)) {<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>      final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      for (RegionState regionState : states) {<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>        if (regionState.isOpened()) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>          openRegionsCount++;<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        } else if (regionState.isClosed()) {<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>          closedRegionCount++;<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>        } else if (regionState.isSplit()) {<a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>          splitRegionCount++;<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>        }<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>      }<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>      totalRegionCount = states.size();<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      ritCount = totalRegionCount - openRegionsCount - splitRegionCount;<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    }<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>    return new RegionStatesCount.RegionStatesCountBuilder()<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      .setOpenRegions(openRegionsCount)<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      .setClosedRegions(closedRegionCount)<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>      .setSplitRegions(splitRegionCount)<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      .setRegionsInTransition(ritCount)<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>      .setTotalRegions(totalRegionCount)<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      .build();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>}<a name="line.2128"></a>
+<span class="sourceLineNo">2089</span>    String highestVersion = Collections.max(serverList,<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    return serverList.stream()<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        .map(Pair::getFirst)<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>        .collect(Collectors.toList());<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>  }<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span><a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>  @VisibleForTesting<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  MasterServices getMaster() {<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>    return master;<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  }<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span><a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  /**<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>   * @return a snapshot of rsReports<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>   */<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public Map&lt;ServerName, Set&lt;byte[]&gt;&gt; getRSReports() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    Map&lt;ServerName, Set&lt;byte[]&gt;&gt; rsReportsSnapshot = new HashMap&lt;&gt;();<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    synchronized (rsReports) {<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>      rsReports.entrySet().forEach(e -&gt; rsReportsSnapshot.put(e.getKey(), e.getValue()));<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>    }<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    return rsReportsSnapshot;<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span><a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>  /**<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>   * Provide regions state count for given table.<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>   * e.g howmany regions of give table are opened/closed/rit etc<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>   *<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>   * @param tableName TableName<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>   * @return region states count<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>   */<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>  public RegionStatesCount getRegionStatesCount(TableName tableName) {<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    int openRegionsCount = 0;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>    int closedRegionCount = 0;<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    int ritCount = 0;<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    int splitRegionCount = 0;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    int totalRegionCount = 0;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    if (!isTableDisabled(tableName)) {<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>      for (RegionState regionState : states) {<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        if (regionState.isOpened()) {<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>          openRegionsCount++;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>        } else if (regionState.isClosed()) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          closedRegionCount++;<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        } else if (regionState.isSplit()) {<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>          splitRegionCount++;<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        }<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>      }<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      totalRegionCount = states.size();<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>      ritCount = totalRegionCount - openRegionsCount - splitRegionCount;<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    }<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    return new RegionStatesCount.RegionStatesCountBuilder()<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span>      .setOpenRegions(openRegionsCount)<a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>      .setClosedRegions(closedRegionCount)<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>      .setSplitRegions(splitRegionCount)<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>      .setRegionsInTransition(ritCount)<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>      .setTotalRegions(totalRegionCount)<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>      .build();<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span>  }<a name="line.2147"></a>
+<span class="sourceLineNo">2148</span><a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>}<a name="line.2149"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
index b020d1a..13b124b 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.RegionInTransitionStat.html
@@ -1973,167 +1973,188 @@
 <span class="sourceLineNo">1965</span>      LOG.debug("Processing assignQueue; systemServersCount=" + serversForSysTables.size() +<a name="line.1965"></a>
 <span class="sourceLineNo">1966</span>          ", allServersCount=" + servers.size());<a name="line.1966"></a>
 <span class="sourceLineNo">1967</span>      processAssignmentPlans(regions, null, systemHRIs,<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>          serversForSysTables.isEmpty()? servers: serversForSysTables);<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>    }<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span><a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
-<span class="sourceLineNo">1973</span><a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>      final List&lt;ServerName&gt; servers) {<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    if (isTraceEnabled) {<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    }<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    final LoadBalancer balancer = getBalancer();<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span>    // ask the balancer where to place regions<a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>      if (isTraceEnabled) {<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>      }<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>      try {<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span>      } catch (HBaseIOException e) {<a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>        LOG.warn("unable to retain assignment", e);<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>      }<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    }<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span><a name="line.1995"></a>
-<span class="sourceLineNo">1996</span>    // TODO: Do we need to split retain and round-robin?<a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    if (!hris.isEmpty()) {<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>      if (isTraceEnabled) {<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span>        LOG.trace("round robin regions=" + hris);<a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>      }<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>      try {<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span>      } catch (HBaseIOException e) {<a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span>        addToPendingAssignment(regions, hris);<a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>      }<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    }<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>  }<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span><a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>    final long st = System.currentTimeMillis();<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span><a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    if (plan == null) {<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    }<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span><a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>    if (plan.isEmpty()) return;<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span><a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    int evcount = 0;<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>      final ServerName server = entry.getKey();<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>        regionNode.setRegionLocation(server);<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>        events[evcount++] = regionNode.getProcedureEvent();<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>      }<a name="line.2030"></a>
+<span class="sourceLineNo">1968</span>          serversForSysTables.isEmpty() &amp;&amp; !containsBogusAssignments(regions, systemHRIs) ?<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>              servers: serversForSysTables);<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>    }<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span><a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>    processAssignmentPlans(regions, retainMap, userHRIs, servers);<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span>  }<a name="line.1973"></a>
+<span class="sourceLineNo">1974</span><a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  private boolean containsBogusAssignments(Map&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>      List&lt;RegionInfo&gt; hirs) {<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    for (RegionInfo ri : hirs) {<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>      if (regions.get(ri).getRegionLocation() != null &amp;&amp;<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>          regions.get(ri).getRegionLocation().equals(LoadBalancer.BOGUS_SERVER_NAME)){<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>        return true;<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>      }<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span>    }<a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    return false;<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span>  }<a name="line.1984"></a>
+<span class="sourceLineNo">1985</span><a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>  private void processAssignmentPlans(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>      final HashMap&lt;RegionInfo, ServerName&gt; retainMap, final List&lt;RegionInfo&gt; hris,<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>      final List&lt;ServerName&gt; servers) {<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    boolean isTraceEnabled = LOG.isTraceEnabled();<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    if (isTraceEnabled) {<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span>      LOG.trace("Available servers count=" + servers.size() + ": " + servers);<a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    }<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span><a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    final LoadBalancer balancer = getBalancer();<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    // ask the balancer where to place regions<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    if (retainMap != null &amp;&amp; !retainMap.isEmpty()) {<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span>      if (isTraceEnabled) {<a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>        LOG.trace("retain assign regions=" + retainMap);<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>      }<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>      try {<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>        acceptPlan(regions, balancer.retainAssignment(retainMap, servers));<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span>      } catch (HBaseIOException e) {<a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>        LOG.warn("unable to retain assignment", e);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>        addToPendingAssignment(regions, retainMap.keySet());<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>      }<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span>    }<a name="line.2006"></a>
+<span class="sourceLineNo">2007</span><a name="line.2007"></a>
+<span class="sourceLineNo">2008</span>    // TODO: Do we need to split retain and round-robin?<a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    // the retain seems to fallback to round-robin/random if the region is not in the map.<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    if (!hris.isEmpty()) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      Collections.sort(hris, RegionInfo.COMPARATOR);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>      if (isTraceEnabled) {<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>        LOG.trace("round robin regions=" + hris);<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span>      }<a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>      try {<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>        acceptPlan(regions, balancer.roundRobinAssignment(hris, servers));<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>      } catch (HBaseIOException e) {<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>        LOG.warn("unable to round-robin assignment", e);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>        addToPendingAssignment(regions, hris);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>      }<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>    }<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>  }<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span><a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>  private void acceptPlan(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      final Map&lt;ServerName, List&lt;RegionInfo&gt;&gt; plan) throws HBaseIOException {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    final ProcedureEvent&lt;?&gt;[] events = new ProcedureEvent[regions.size()];<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>    final long st = System.currentTimeMillis();<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>    if (plan == null) {<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>      throw new HBaseIOException("unable to compute plans for regions=" + regions.size());<a name="line.2030"></a>
 <span class="sourceLineNo">2031</span>    }<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span><a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    final long et = System.currentTimeMillis();<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    if (LOG.isTraceEnabled()) {<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>          StringUtils.humanTimeDiff(et - st));<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    }<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>  }<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    assignQueueLock.lock();<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    try {<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>      for (RegionInfo hri: pendingRegions) {<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>      }<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    } finally {<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>      assignQueueLock.unlock();<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span>    }<a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>  }<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span><a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>  /**<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>   * For system tables, we must assign them to a server with highest version.<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>   */<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    // RegionServerInfo that includes Version.<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>        .stream()<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>        .collect(Collectors.toList());<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>    if (serverList.isEmpty()) {<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>      return Collections.emptyList();<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span>    }<a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    String highestVersion = Collections.max(serverList,<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    return serverList.stream()<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>        .map(Pair::getFirst)<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>        .collect(Collectors.toList());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>  }<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span><a name="line.2075"></a>
-<span class="sourceLineNo">2076</span>  @VisibleForTesting<a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>  MasterServices getMaster() {<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    return master;<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>  }<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span><a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>  /**<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>   * @return a snapshot of rsReports<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span>   */<a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>  public Map&lt;ServerName, Set&lt;byte[]&gt;&gt; getRSReports() {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    Map&lt;ServerName, Set&lt;byte[]&gt;&gt; rsReportsSnapshot = new HashMap&lt;&gt;();<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    synchronized (rsReports) {<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>      rsReports.entrySet().forEach(e -&gt; rsReportsSnapshot.put(e.getKey(), e.getValue()));<a name="line.2087"></a>
+<span class="sourceLineNo">2032</span><a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    if (plan.isEmpty()) return;<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span><a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    int evcount = 0;<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    for (Map.Entry&lt;ServerName, List&lt;RegionInfo&gt;&gt; entry: plan.entrySet()) {<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>      final ServerName server = entry.getKey();<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>      for (RegionInfo hri: entry.getValue()) {<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>        final RegionStateNode regionNode = regions.get(hri);<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>        regionNode.setRegionLocation(server);<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span>        if (server.equals(LoadBalancer.BOGUS_SERVER_NAME) &amp;&amp; regionNode.isSystemTable()) {<a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>          assignQueueLock.lock();<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span>          try {<a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>            pendingAssignQueue.add(regionNode);<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>          } finally {<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>            assignQueueLock.unlock();<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>          }<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>        }else {<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>          events[evcount++] = regionNode.getProcedureEvent();<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>        }<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span>      }<a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    }<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    ProcedureEvent.wakeEvents(getProcedureScheduler(), events);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span><a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    final long et = System.currentTimeMillis();<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    if (LOG.isTraceEnabled()) {<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>      LOG.trace("ASSIGN ACCEPT " + events.length + " -&gt; " +<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>          StringUtils.humanTimeDiff(et - st));<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span>    }<a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>  }<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span><a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>  private void addToPendingAssignment(final HashMap&lt;RegionInfo, RegionStateNode&gt; regions,<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>      final Collection&lt;RegionInfo&gt; pendingRegions) {<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    assignQueueLock.lock();<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    try {<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>      for (RegionInfo hri: pendingRegions) {<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>        pendingAssignQueue.add(regions.get(hri));<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span>      }<a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    } finally {<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>      assignQueueLock.unlock();<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    }<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>  }<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span><a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>  /**<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>   * Get a list of servers that this region cannot be assigned to.<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>   * For system tables, we must assign them to a server with highest version.<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span>   */<a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>  public List&lt;ServerName&gt; getExcludedServersForSystemTable() {<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    // TODO: This should be a cached list kept by the ServerManager rather than calculated on each<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    // move or system region assign. The RegionServerTracker keeps list of online Servers with<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    // RegionServerInfo that includes Version.<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>    List&lt;Pair&lt;ServerName, String&gt;&gt; serverList = master.getServerManager().getOnlineServersList()<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>        .stream()<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span>        .map((s)-&gt;new Pair&lt;&gt;(s, master.getRegionServerVersion(s)))<a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>        .collect(Collectors.toList());<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    if (serverList.isEmpty()) {<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>      return Collections.emptyList();<a name="line.2087"></a>
 <span class="sourceLineNo">2088</span>    }<a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    return rsReportsSnapshot;<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>  }<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span><a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>  /**<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>   * Provide regions state count for given table.<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>   * e.g howmany regions of give table are opened/closed/rit etc<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>   *<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>   * @param tableName TableName<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>   * @return region states count<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span>   */<a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  public RegionStatesCount getRegionStatesCount(TableName tableName) {<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>    int openRegionsCount = 0;<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>    int closedRegionCount = 0;<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>    int ritCount = 0;<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>    int splitRegionCount = 0;<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    int totalRegionCount = 0;<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    if (!isTableDisabled(tableName)) {<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>      final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>      for (RegionState regionState : states) {<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span>        if (regionState.isOpened()) {<a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>          openRegionsCount++;<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>        } else if (regionState.isClosed()) {<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>          closedRegionCount++;<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span>        } else if (regionState.isSplit()) {<a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>          splitRegionCount++;<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>        }<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span>      }<a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>      totalRegionCount = states.size();<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>      ritCount = totalRegionCount - openRegionsCount - splitRegionCount;<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    }<a name="line.2118"></a>
-<span class="sourceLineNo">2119</span>    return new RegionStatesCount.RegionStatesCountBuilder()<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>      .setOpenRegions(openRegionsCount)<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span>      .setClosedRegions(closedRegionCount)<a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>      .setSplitRegions(splitRegionCount)<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>      .setRegionsInTransition(ritCount)<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>      .setTotalRegions(totalRegionCount)<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>      .build();<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>}<a name="line.2128"></a>
+<span class="sourceLineNo">2089</span>    String highestVersion = Collections.max(serverList,<a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>        (o1, o2) -&gt; VersionInfo.compareVersion(o1.getSecond(), o2.getSecond())).getSecond();<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    return serverList.stream()<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>        .filter((p)-&gt;!p.getSecond().equals(highestVersion))<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        .map(Pair::getFirst)<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>        .collect(Collectors.toList());<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>  }<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span><a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>  @VisibleForTesting<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  MasterServices getMaster() {<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span>    return master;<a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  }<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span><a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  /**<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>   * @return a snapshot of rsReports<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>   */<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>  public Map&lt;ServerName, Set&lt;byte[]&gt;&gt; getRSReports() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    Map&lt;ServerName, Set&lt;byte[]&gt;&gt; rsReportsSnapshot = new HashMap&lt;&gt;();<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    synchronized (rsReports) {<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>      rsReports.entrySet().forEach(e -&gt; rsReportsSnapshot.put(e.getKey(), e.getValue()));<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span>    }<a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    return rsReportsSnapshot;<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>  }<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span><a name="line.2112"></a>
+<span class="sourceLineNo">2113</span>  /**<a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>   * Provide regions state count for given table.<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>   * e.g howmany regions of give table are opened/closed/rit etc<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span>   *<a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>   * @param tableName TableName<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>   * @return region states count<a name="line.2118"></a>
+<span class="sourceLineNo">2119</span>   */<a name="line.2119"></a>
+<span class="sourceLineNo">2120</span>  public RegionStatesCount getRegionStatesCount(TableName tableName) {<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    int openRegionsCount = 0;<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span>    int closedRegionCount = 0;<a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    int ritCount = 0;<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    int splitRegionCount = 0;<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    int totalRegionCount = 0;<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    if (!isTableDisabled(tableName)) {<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>      final List&lt;RegionState&gt; states = regionStates.getTableRegionStates(tableName);<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span>      for (RegionState regionState : states) {<a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>        if (regionState.isOpened()) {<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>          openRegionsCount++;<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>        } else if (regionState.isClosed()) {<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>          closedRegionCount++;<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>        } else if (regionState.isSplit()) {<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>          splitRegionCount++;<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>        }<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span>      }<a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>      totalRegionCount = states.size();<a name="line.2137"></a>
... 11384 lines suppressed ...