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 ©2007–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> </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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configureIncrementalLoad</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.581">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.577">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
<a href="../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> table,
<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a> 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configureIncrementalLoad</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.600">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.596">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> tableDescriptor,
<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a> 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<<a href="../.
<ul class="blockListLast">
<li class="blockList">
<h4>configureIncrementalLoadMap</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.686">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.682">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job job,
<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockList">
<li class="blockList">
<h4>buildDependencyClasspath</h4>
-<pre>public 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> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.833">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public 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> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.834">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockList">
<li class="blockList">
<h4>addDependencyJars</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.857">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job job)
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.858">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job 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 void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.886">addDependencyJars</a>(org.apache.hadoop.conf.Configuration conf,
+public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.887">addDependencyJars</a>(org.apache.hadoop.conf.Configuration 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><?>... 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> <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> version)</code> </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> </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>[] args)</code> </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> out)</code> </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> out)</code> </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> v2)</pre>
</li>
</ul>
+<a name="getMajorVersion-java.lang.String-">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getMajorVersion</h4>
+<pre>public static int <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> version)</pre>
+</li>
+</ul>
<a name="main-java.lang.String:A-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>main</h4>
-<pre>public static void <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>[] args)</pre>
+<pre>public static void <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>[] 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<byte[], WriterLength> writers =<a name="line.236"></a>
<span class="sourceLineNo">237</span> new TreeMap<>(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<byte[], byte[]> previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span> new TreeMap<>(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 && wl.written + length >= 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 && 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 > 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 && wl.written + length >= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span> && 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 > 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) >= 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) >= 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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.570"></a>
-<span class="sourceLineNo">571</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.571"></a>
-<span class="sourceLineNo">572</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.572"></a>
-<span class="sourceLineNo">573</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.573"></a>
-<span class="sourceLineNo">574</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.574"></a>
-<span class="sourceLineNo">575</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span> * PutSortReducer)</li><a name="line.576"></a>
-<span class="sourceLineNo">577</span> * </ul><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> * <ul><a name="line.589"></a>
-<span class="sourceLineNo">590</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.590"></a>
-<span class="sourceLineNo">591</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.591"></a>
-<span class="sourceLineNo">592</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.592"></a>
-<span class="sourceLineNo">593</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.593"></a>
-<span class="sourceLineNo">594</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span> * PutSortReducer)</li><a name="line.595"></a>
-<span class="sourceLineNo">596</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span> Class<? extends OutputFormat<?, ?>> 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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.566"></a>
+<span class="sourceLineNo">567</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.567"></a>
+<span class="sourceLineNo">568</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.568"></a>
+<span class="sourceLineNo">569</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.569"></a>
+<span class="sourceLineNo">570</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.570"></a>
+<span class="sourceLineNo">571</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span> * PutSortReducer)</li><a name="line.572"></a>
+<span class="sourceLineNo">573</span> * </ul><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> * <ul><a name="line.585"></a>
+<span class="sourceLineNo">586</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.586"></a>
+<span class="sourceLineNo">587</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.587"></a>
+<span class="sourceLineNo">588</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.588"></a>
+<span class="sourceLineNo">589</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.589"></a>
+<span class="sourceLineNo">590</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span> * PutSortReducer)</li><a name="line.591"></a>
+<span class="sourceLineNo">592</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span> Class<? extends OutputFormat<?, ?>> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span> conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span> Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span> conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span> Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<String> paths = new HashSet<>(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() > 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 <a href="https://issues.apache.org/jira/browse/HBASE-8386">HBASE-8386</a><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<?>... classes) throws IOException {<a name="line.887"></a>
-<span class="sourceLineNo">888</span> LOG.warn("The addDependencyJars(Configuration, Class<?>...) 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<?>... 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<String> jars = new HashSet<>();<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<String, String> packagedClasses = new HashMap<>();<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<?> 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<?> my_class, FileSystem fs,<a name="line.955"></a>
-<span class="sourceLineNo">956</span> Map<String, String> 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 <code>packagedClasses</code> corresponding to class files<a name="line.974"></a>
-<span class="sourceLineNo">975</span> * contained in <code>jar</code>.<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 -> 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<String, String> 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<? extends ZipEntry> 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 <code>packagedClasses</code> 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<?> my_class, Map<String, String> 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<URL> 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<?> 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<String> paths = new HashSet<>(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() > 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 <a href="https://issues.apache.org/jira/browse/HBASE-8386">HBASE-8386</a><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<?>... classes) throws IOException {<a name="line.888"></a>
+<span class="sourceLineNo">889</span> LOG.warn("The addDependencyJars(Configuration, Class<?>...) 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<?>... 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<String> jars = new HashSet<>();<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<String, String> packagedClasses = new HashMap<>();<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<?> 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<?> my_class, FileSystem fs,<a name="line.956"></a>
+<span class="sourceLineNo">957</span> Map<String, String> 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 <code>packagedClasses</code> corresponding to class files<a name="line.975"></a>
+<span class="sourceLineNo">976</span> * contained in <code>jar</code>.<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 -> 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<String, String> 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<? extends ZipEntry> 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 <code>packagedClasses</code> 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<?> my_class, Map<String, String> 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<URL> 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<?> 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 ©2007–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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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 ©2007–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 ©2007–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 ©2007–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 ©2007–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 ©2007–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 ©2007–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 static final <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 static final <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 static final <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> </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#containsBogusAssignments-java.util.Map-java.util.List-">containsBogusAssignments(Map<RegionInfo, RegionStateNode>, List<RegionInfo>)</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> </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> </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> </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> </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> </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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <a href="../../../../src-html/org/apache/hadoop/hbase/Version.html#line.9">Version</a>()</pre>
+<pre>public <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><E> (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><T>, 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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> pendingRegions)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> hirs)</code> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> hirs)</code> </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><<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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>compressionDetails</h4>
-<pre>static <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><<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>> [...]
+<pre>static <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><<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>> [...]
<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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>blockSizeDetails</h4>
-<pre>static <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><<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>> [...]
+<pre>static <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><<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>> [...]
<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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>bloomTypeDetails</h4>
-<pre>static <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><<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>> [...]
+<pre>static <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><<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>> [...]
<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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>bloomParamDetails</h4>
-<pre>static <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><<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>> [...]
+<pre>static <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><<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>> [...]
<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<<a href="../.
<ul class="blockListLast">
<li class="blockList">
<h4>dataBlockEncodingDetails</h4>
-<pre>static <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><<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>> [...]
+<pre>static <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><<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>> [...]
<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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configureStoragePolicy</h4>
-<pre>static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.472">configureStoragePolicy</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.468">configureStoragePolicy</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.fs.FileSystem fs,
byte[] tableAndFamily,
org.apache.hadoop.fs.Path cfPath)</pre>
@@ -812,7 +812,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>getRegionStartKeys</h4>
-<pre>private static <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><<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>> <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 <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><<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.492">getRegionStartKeys</a>(<a href="https://docs.oracle.com/javase/8/ [...]
boolean 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>writePartitions</h4>
-<pre>private static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.528">writePartitions</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>private static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.524">writePartitions</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.fs.Path 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><<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>> startKeys,
boolean writeMultipleTables)
@@ -848,7 +848,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configureIncrementalLoad</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.581">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.577">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
<a href="../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> table,
<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a> 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configureIncrementalLoad</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.600">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.596">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> tableDescriptor,
<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a> 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configureIncrementalLoad</h4>
-<pre>static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.607">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.603">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job 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><<a href="../../../../../org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.TableInfo.html" title="class in org.apache.hadoop.hbase.mapreduce">HFileOutputFormat2.TableInfo</a>> 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><? extends org.apache.hadoop.mapreduce.OutputFormat<?,?>> 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configureIncrementalLoadMap</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.686">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.682">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job job,
<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>createFamilyCompressionMap</h4>
-<pre>static <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><byte[],<a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.723">createFamilyCompressionMap</a>(org.apache.hadoop.conf [...]
+<pre>static <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><byte[],<a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>createFamilyBloomTypeMap</h4>
-<pre>static <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><byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver">BloomType</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.743">createFamilyBloomTypeMap</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>static <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><byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver">BloomType</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.739">createFamilyBloomTypeMap</a>(org.apache.hadoop.conf.Configuration 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>createFamilyBloomParamMap</h4>
-<pre>static <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><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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.762">createFamilyBloomParamMap</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>static <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><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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.758">createFamilyBloomParamMap</a>(org.apache.hadoop.conf.Configuration 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>createFamilyBlockSizeMap</h4>
-<pre>static <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><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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.775">createFamilyBlockSizeMap</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>static <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><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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.771">createFamilyBlockSizeMap</a>(org.apache.hadoop.conf.Configuration 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>createFamilyDataBlockEncodingMap</h4>
-<pre>static <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><byte[],<a href="../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.795">createFamilyDataBlockEncodingMap</a>(org.apache.hadoop.conf.C [...]
+<pre>static <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><byte[],<a href="../../../../../org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.html" title="enum in org.apache.hadoop.hbase.io.encoding">DataBlockEncoding</a>> <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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>createFamilyConfValueMap</h4>
-<pre>private static <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><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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.814">createFamilyConfValueMap</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>private static <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><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>> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.810">createFamilyConfValueMap</a>(org.apache.hadoop.conf.Configuration 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> 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<<a href="../.
<ul class="blockList">
<li class="blockList">
<h4>configurePartitioner</h4>
-<pre>static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.838">configurePartitioner</a>(org.apache.hadoop.mapreduce.Job job,
+<pre>static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.834">configurePartitioner</a>(org.apache.hadoop.mapreduce.Job 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><<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>> splitPoints,
boolean 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<<a href="../.
<ul class="blockListLast">
<li class="blockList">
<h4>serializeColumnFamilyAttribute</h4>
-<pre>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> <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><<a href="../../../../../o [...]
+<pre>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> <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><<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><<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>> 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockList">
<li class="blockList">
<h4>buildDependencyClasspath</h4>
-<pre>public 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> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.833">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration conf)</pre>
+<pre>public 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> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.834">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockList">
<li class="blockList">
<h4>addDependencyJars</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.857">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job job)
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.858">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job 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 void <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.886">addDependencyJars</a>(org.apache.hadoop.conf.Configuration conf,
+public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.887">addDependencyJars</a>(org.apache.hadoop.conf.Configuration 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><?>... 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> <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 void <a href="../../../../../src-html/org/apache/hadoop/
<li class="blockList">
<h4>addDependencyJarsForClasses</h4>
<pre>@InterfaceAudience.Private
-public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.908">addDependencyJarsForClasses</a>(org.apache.hadoop.conf.Configuration conf,
+public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.909">addDependencyJarsForClasses</a>(org.apache.hadoop.conf.Configuration 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><?>... 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockList">
<li class="blockList">
<h4>findOrCreateJar</h4>
-<pre>private static org.apache.hadoop.fs.Path <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><?> my_class,
+<pre>private static org.apache.hadoop.fs.Path <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><?> my_class,
org.apache.hadoop.fs.FileSystem 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><<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>> 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockList">
<li class="blockList">
<h4>updateMap</h4>
-<pre>private static void <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> jar,
+<pre>private static void <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> 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><<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>> 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockList">
<li class="blockList">
<h4>findContainingJar</h4>
-<pre>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> <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><?> my_class,
+<pre>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> <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><?> 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><<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>> 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 void <a href="../../../../../src-html/org/apache/hadoop/
<ul class="blockListLast">
<li class="blockList">
<h4>getJar</h4>
-<pre>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> <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><?> my_class)</pre>
+<pre>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> <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><?> 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><E> (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><T>, 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> </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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> hirs)</code> </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> regionNode,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> targetServer,
boolean override)</code> </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><<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><<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>... ris)</code> </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> regionInfo,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> targetServer)</code> </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> hri,
boolean 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> hri,
boolean 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><<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><<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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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> regionToSplit,
byte[] splitKey)</code> </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> regionNode,
boolean override)</code> </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> 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> 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><<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#getAssignedRegions--">getAssignedRegions</a></span>()</code> </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> </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> </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> </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> </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> </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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>></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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>></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> regionInfo)</code> </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> </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><?></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> metaRegionInfo)</code> </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> regionInfo)</code> </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[] regionName)</code> </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><<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#getMetaRegionSet--">getMetaRegionSet</a></span>()</code> </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> </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> </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> </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[] regionName)</code> </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><<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRegionsInTransition--">getRegionsInTransition</a></span>()</code> </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><<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#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> 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> </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> 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> </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><<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>></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> 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><<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><byte[]>></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#getRSReports--">getRSReports</a></span>()</code> </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><<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><<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><<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><<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#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> serverName)</code> </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> </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> regionInfo)</code> </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> </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> serverName)</code> </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> serverName,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> regionInfo)</code> </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[] regionName)</code> </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> regionInfo)</code> </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> </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> </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> tableName)</code> </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> tableName)</code> </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> </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> </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> 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> child,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> 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> serverName,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> daughterA,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> daughterB)</code> </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> regionInfo)</code> </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><byte[]></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> regionPlan)</code> </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> regionInfo)</code> </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> regionInfo,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> serverName)</code> </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> regionNode)</code> </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> regionNode,
<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>[] expectedStates)</code> </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><<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><<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>> 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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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> </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> 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> regionNode)</code> </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> regionNode)</code> </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> regionNode)</code> </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> regionNode,
boolean giveUp)</code> </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> regionNode)</code> </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> regionNode)</code> </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> 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><byte[]> 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 req)</code> </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> 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><org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition> transitionList)</code> </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> serverNode,
@@ -800,58 +805,58 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
long seqId,
long procId)</code> </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> metaRegionInfo,
boolean assigned)</code> </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><<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> region)</code> </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> </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> </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> </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> </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> serverName,
boolean shouldSplitWal)</code> </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> newState,
<a href="../../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>... expectedStates)</code> </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> regionInfo)</code> </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 deadRegions,
int unknownRegions)</code> </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 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> hriA,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> hriB)</code> </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 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> hriA,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> hriB)</code> </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 state,
@@ -879,24 +884,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
long seqId,
long procId)</code> </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><?> proc,
<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> 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><?> 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><<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> </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> </td>
</tr>
@@ -2617,13 +2622,23 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<pre>private void <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 boolean <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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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 void <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><<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 void <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><<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><<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>> 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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> 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 void <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><<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 void <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><<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><<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><<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 void <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><<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 void <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><<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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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 <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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#line.2057">getExcludedServersForSystemTable</a>()</pre>
+<pre>public <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><<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/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> <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> <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 <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><<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><byte[]>> <a href="../../../../../../src-html/org/apache/hadoop [...]
+<pre>public <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><<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><byte[]>> <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 <a href="../../../../../../org/apache/hadoop/hbase/client/RegionStatesCount.html" title="class in org.apache.hadoop.hbase.client">RegionStatesCount</a> <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> tableName)</pre>
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/client/RegionStatesCount.html" title="class in org.apache.hadoop.hbase.client">RegionStatesCount</a> <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> 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><<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> pendingRegions)</code> </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><<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><<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> hirs)</code> </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><<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>></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> 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><<a href="../../../../../../../org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a>> filter)</code> </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><<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><<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><<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>> 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><<a href="../../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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><<a href="../../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>> servers)</code> </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><<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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 void <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> jamonWriter,
+<pre>private void <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> jamonWriter,
<a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfo.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupInfo</a>[] 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><<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>> 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 void <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> jamonWriter,
+<pre>private void <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> jamonWriter,
<a href="../../../../../../org/apache/hadoop/hbase/rsgroup/RSGroupInfo.html" title="class in org.apache.hadoop.hbase.rsgroup">RSGroupInfo</a>[] 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><<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>> 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 void <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> jamonWriter,
+<pre>private void <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> jamonWriter,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[] 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 void <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> jamonWriter,
+<pre>private void <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> jamonWriter,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[] 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 void <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> jamonWriter,
+<pre>private void <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> jamonWriter,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> 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 void <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> jamonWriter,
+<pre>private void <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> jamonWriter,
<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[] 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 void <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> jamonWriter,
+<pre>private void <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> 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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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 void <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> jamonWriter,
+<pre>private void <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> 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><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> 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> version)</code> </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> 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> </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>[] args)</code> </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> </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> out)</code> </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> out)</code> </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 int <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> version)</pre>
+</li>
+</ul>
<a name="main-java.lang.String:A-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>main</h4>
-<pre>public static void <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>[] args)</pre>
+<pre>public static void <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>[] 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><E> (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><T>, 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><T>)</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><T>)</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><T>)</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><E> (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><T>, 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<byte[], WriterLength> writers =<a name="line.236"></a>
<span class="sourceLineNo">237</span> new TreeMap<>(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<byte[], byte[]> previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span> new TreeMap<>(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 && wl.written + length >= 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 && 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 > 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 && wl.written + length >= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span> && 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 > 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) >= 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) >= 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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.570"></a>
-<span class="sourceLineNo">571</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.571"></a>
-<span class="sourceLineNo">572</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.572"></a>
-<span class="sourceLineNo">573</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.573"></a>
-<span class="sourceLineNo">574</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.574"></a>
-<span class="sourceLineNo">575</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span> * PutSortReducer)</li><a name="line.576"></a>
-<span class="sourceLineNo">577</span> * </ul><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> * <ul><a name="line.589"></a>
-<span class="sourceLineNo">590</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.590"></a>
-<span class="sourceLineNo">591</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.591"></a>
-<span class="sourceLineNo">592</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.592"></a>
-<span class="sourceLineNo">593</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.593"></a>
-<span class="sourceLineNo">594</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span> * PutSortReducer)</li><a name="line.595"></a>
-<span class="sourceLineNo">596</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span> Class<? extends OutputFormat<?, ?>> 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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.566"></a>
+<span class="sourceLineNo">567</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.567"></a>
+<span class="sourceLineNo">568</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.568"></a>
+<span class="sourceLineNo">569</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.569"></a>
+<span class="sourceLineNo">570</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.570"></a>
+<span class="sourceLineNo">571</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span> * PutSortReducer)</li><a name="line.572"></a>
+<span class="sourceLineNo">573</span> * </ul><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> * <ul><a name="line.585"></a>
+<span class="sourceLineNo">586</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.586"></a>
+<span class="sourceLineNo">587</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.587"></a>
+<span class="sourceLineNo">588</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.588"></a>
+<span class="sourceLineNo">589</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.589"></a>
+<span class="sourceLineNo">590</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span> * PutSortReducer)</li><a name="line.591"></a>
+<span class="sourceLineNo">592</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span> Class<? extends OutputFormat<?, ?>> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span> conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span> Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span> conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span> Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<byte[], WriterLength> writers =<a name="line.236"></a>
<span class="sourceLineNo">237</span> new TreeMap<>(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<byte[], byte[]> previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span> new TreeMap<>(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 && wl.written + length >= 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 && 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 > 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 && wl.written + length >= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span> && 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 > 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) >= 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) >= 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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.570"></a>
-<span class="sourceLineNo">571</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.571"></a>
-<span class="sourceLineNo">572</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.572"></a>
-<span class="sourceLineNo">573</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.573"></a>
-<span class="sourceLineNo">574</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.574"></a>
-<span class="sourceLineNo">575</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span> * PutSortReducer)</li><a name="line.576"></a>
-<span class="sourceLineNo">577</span> * </ul><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> * <ul><a name="line.589"></a>
-<span class="sourceLineNo">590</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.590"></a>
-<span class="sourceLineNo">591</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.591"></a>
-<span class="sourceLineNo">592</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.592"></a>
-<span class="sourceLineNo">593</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.593"></a>
-<span class="sourceLineNo">594</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span> * PutSortReducer)</li><a name="line.595"></a>
-<span class="sourceLineNo">596</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span> Class<? extends OutputFormat<?, ?>> 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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.566"></a>
+<span class="sourceLineNo">567</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.567"></a>
+<span class="sourceLineNo">568</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.568"></a>
+<span class="sourceLineNo">569</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.569"></a>
+<span class="sourceLineNo">570</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.570"></a>
+<span class="sourceLineNo">571</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span> * PutSortReducer)</li><a name="line.572"></a>
+<span class="sourceLineNo">573</span> * </ul><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> * <ul><a name="line.585"></a>
+<span class="sourceLineNo">586</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.586"></a>
+<span class="sourceLineNo">587</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.587"></a>
+<span class="sourceLineNo">588</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.588"></a>
+<span class="sourceLineNo">589</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.589"></a>
+<span class="sourceLineNo">590</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span> * PutSortReducer)</li><a name="line.591"></a>
+<span class="sourceLineNo">592</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span> Class<? extends OutputFormat<?, ?>> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span> conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span> Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span> conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span> Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<byte[], WriterLength> writers =<a name="line.236"></a>
<span class="sourceLineNo">237</span> new TreeMap<>(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<byte[], byte[]> previousRows =<a name="line.238"></a>
+<span class="sourceLineNo">239</span> new TreeMap<>(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 && wl.written + length >= 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 && 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 > 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 && wl.written + length >= maxsize<a name="line.290"></a>
+<span class="sourceLineNo">291</span> && 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 > 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) >= 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) >= 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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> getRegionStartKeys(List<RegionLocator> 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<ImmutableBytesWritable> ret = new ArrayList<>();<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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.570"></a>
-<span class="sourceLineNo">571</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.571"></a>
-<span class="sourceLineNo">572</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.572"></a>
-<span class="sourceLineNo">573</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.573"></a>
-<span class="sourceLineNo">574</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.574"></a>
-<span class="sourceLineNo">575</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
-<span class="sourceLineNo">576</span> * PutSortReducer)</li><a name="line.576"></a>
-<span class="sourceLineNo">577</span> * </ul><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> * <ul><a name="line.589"></a>
-<span class="sourceLineNo">590</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.590"></a>
-<span class="sourceLineNo">591</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.591"></a>
-<span class="sourceLineNo">592</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.592"></a>
-<span class="sourceLineNo">593</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.593"></a>
-<span class="sourceLineNo">594</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
-<span class="sourceLineNo">595</span> * PutSortReducer)</li><a name="line.595"></a>
-<span class="sourceLineNo">596</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.607"></a>
-<span class="sourceLineNo">608</span> Class<? extends OutputFormat<?, ?>> 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<ImmutableBytesWritable> 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 < 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<ImmutableBytesWritable> sorted = new TreeSet<>(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> * <ul><a name="line.566"></a>
+<span class="sourceLineNo">567</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.567"></a>
+<span class="sourceLineNo">568</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.568"></a>
+<span class="sourceLineNo">569</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.569"></a>
+<span class="sourceLineNo">570</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.570"></a>
+<span class="sourceLineNo">571</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.571"></a>
+<span class="sourceLineNo">572</span> * PutSortReducer)</li><a name="line.572"></a>
+<span class="sourceLineNo">573</span> * </ul><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> * <ul><a name="line.585"></a>
+<span class="sourceLineNo">586</span> * <li>Inspects the table to configure a total order partitioner</li><a name="line.586"></a>
+<span class="sourceLineNo">587</span> * <li>Uploads the partitions file to the cluster and adds it to the DistributedCache</li><a name="line.587"></a>
+<span class="sourceLineNo">588</span> * <li>Sets the number of reduce tasks to match the current number of regions</li><a name="line.588"></a>
+<span class="sourceLineNo">589</span> * <li>Sets the output key/value class to match HFileOutputFormat2's requirements</li><a name="line.589"></a>
+<span class="sourceLineNo">590</span> * <li>Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.590"></a>
+<span class="sourceLineNo">591</span> * PutSortReducer)</li><a name="line.591"></a>
+<span class="sourceLineNo">592</span> * </ul><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<TableInfo> singleTableInfo = new ArrayList<>();<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<TableInfo> multiTableInfo,<a name="line.603"></a>
+<span class="sourceLineNo">604</span> Class<? extends OutputFormat<?, ?>> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.645"></a>
-<span class="sourceLineNo">646</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<String> allTableNames = new ArrayList<>(multiTableInfo.size());<a name="line.641"></a>
+<span class="sourceLineNo">642</span> List<RegionLocator> regionLocators = new ArrayList<>( multiTableInfo.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span> List<TableDescriptor> tableDescriptors = new ArrayList<>( 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<ImmutableBytesWritable> 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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.723"></a>
-<span class="sourceLineNo">724</span> conf) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
-<span class="sourceLineNo">728</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
-<span class="sourceLineNo">744</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
-<span class="sourceLineNo">747</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
-<span class="sourceLineNo">779</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.795"></a>
-<span class="sourceLineNo">796</span> Configuration conf) {<a name="line.796"></a>
-<span class="sourceLineNo">797</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
-<span class="sourceLineNo">800</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
-<span class="sourceLineNo">836</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<TableDescriptor> singleTableDescriptor = new ArrayList<>(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<byte[], Algorithm> createFamilyCompressionMap(Configuration<a name="line.719"></a>
+<span class="sourceLineNo">720</span> conf) {<a name="line.720"></a>
+<span class="sourceLineNo">721</span> Map<byte[], String> 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<byte[], Algorithm> compressionMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.723"></a>
+<span class="sourceLineNo">724</span> for (Map.Entry<byte[], String> 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<byte[], BloomType> createFamilyBloomTypeMap(Configuration conf) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span> Map<byte[], String> 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<byte[], BloomType> bloomTypeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.742"></a>
+<span class="sourceLineNo">743</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], Integer> createFamilyBlockSizeMap(Configuration conf) {<a name="line.771"></a>
+<span class="sourceLineNo">772</span> Map<byte[], String> 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<byte[], Integer> blockSizeMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.774"></a>
+<span class="sourceLineNo">775</span> for (Map.Entry<byte[], String> 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<byte[], DataBlockEncoding> createFamilyDataBlockEncodingMap(<a name="line.791"></a>
+<span class="sourceLineNo">792</span> Configuration conf) {<a name="line.792"></a>
+<span class="sourceLineNo">793</span> Map<byte[], String> 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<byte[], DataBlockEncoding> encoderMap = new TreeMap<>(Bytes.BYTES_COMPARATOR);<a name="line.795"></a>
+<span class="sourceLineNo">796</span> for (Map.Entry<byte[], String> 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<byte[], String> 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<byte[], String> confValMap = new TreeMap<>(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("&")) {<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 <code>job</code> with a TotalOrderPartitioner, partitioning against<a name="line.831"></a>
+<span class="sourceLineNo">832</span> * <code>splitPoints</code>. 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<ImmutableBytesWritable> 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<ColumnFamilyDescriptor, String> fn, List<TableDescriptor> 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++ > 0) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span> attributeValue.append('&');<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<ColumnFamilyDescriptor, String> compressionDetails = familyDescriptor -><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<ColumnFamilyDescriptor, String> blockSizeDetails = familyDescriptor -> 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<ColumnFamilyDescriptor, String> bloomTypeDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> bloomParamDetails = familyDescriptor -> {<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<ColumnFamilyDescriptor, String> dataBlockEncodingDetails = familyDescriptor -> {<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<String> paths = new HashSet<>(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() > 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 <a href="https://issues.apache.org/jira/browse/HBASE-8386">HBASE-8386</a><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<?>... classes) throws IOException {<a name="line.887"></a>
-<span class="sourceLineNo">888</span> LOG.warn("The addDependencyJars(Configuration, Class<?>...) 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<?>... 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<String> jars = new HashSet<>();<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<String, String> packagedClasses = new HashMap<>();<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<?> 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<?> my_class, FileSystem fs,<a name="line.955"></a>
-<span class="sourceLineNo">956</span> Map<String, String> 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 <code>packagedClasses</code> corresponding to class files<a name="line.974"></a>
-<span class="sourceLineNo">975</span> * contained in <code>jar</code>.<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 -> 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<String, String> 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<? extends ZipEntry> 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 <code>packagedClasses</code> 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<?> my_class, Map<String, String> 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<URL> 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<?> 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<String> paths = new HashSet<>(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() > 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 <a href="https://issues.apache.org/jira/browse/HBASE-8386">HBASE-8386</a><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<?>... classes) throws IOException {<a name="line.888"></a>
+<span class="sourceLineNo">889</span> LOG.warn("The addDependencyJars(Configuration, Class<?>...) 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<?>... 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<String> jars = new HashSet<>();<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<String, String> packagedClasses = new HashMap<>();<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<?> 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<?> my_class, FileSystem fs,<a name="line.956"></a>
+<span class="sourceLineNo">957</span> Map<String, String> 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 <code>packagedClasses</code> corresponding to class files<a name="line.975"></a>
+<span class="sourceLineNo">976</span> * contained in <code>jar</code>.<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 -> 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<String, String> 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<? extends ZipEntry> 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 <code>packagedClasses</code> 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<?> my_class, Map<String, String> 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<URL> 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<?> 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<RegionInfo, RegionStateNode> regions,<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span> final HashMap<RegionInfo, ServerName> retainMap, final List<RegionInfo> hris,<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span> final List<ServerName> 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 && !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<RegionInfo, RegionStateNode> regions,<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span> final Map<ServerName, List<RegionInfo>> plan) throws HBaseIOException {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span> final ProcedureEvent<?>[] 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<ServerName, List<RegionInfo>> 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() && !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<RegionInfo, RegionStateNode> regions,<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span> List<RegionInfo> 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 &&<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<RegionInfo, RegionStateNode> regions,<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span> final HashMap<RegionInfo, ServerName> retainMap, final List<RegionInfo> hris,<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span> final List<ServerName> 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 && !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<RegionInfo, RegionStateNode> regions,<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span> final Map<ServerName, List<RegionInfo>> plan) throws HBaseIOException {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span> final ProcedureEvent<?>[] 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 + " -> " +<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<RegionInfo, RegionStateNode> regions,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span> final Collection<RegionInfo> 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<ServerName> 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<Pair<ServerName, String>> 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)->new Pair<>(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) -> 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)->!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<ServerName, Set<byte[]>> getRSReports() {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span> Map<ServerName, Set<byte[]>> rsReportsSnapshot = new HashMap<>();<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 -> 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<ServerName, List<RegionInfo>> 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) && 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 + " -> " +<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<RegionInfo, RegionStateNode> regions,<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span> final Collection<RegionInfo> 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<ServerName> 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<Pair<ServerName, String>> 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)->new Pair<>(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<RegionState> 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) -> 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)->!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<ServerName, Set<byte[]>> getRSReports() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span> Map<ServerName, Set<byte[]>> rsReportsSnapshot = new HashMap<>();<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 -> 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<RegionState> 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<RegionInfo, RegionStateNode> regions,<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span> final HashMap<RegionInfo, ServerName> retainMap, final List<RegionInfo> hris,<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span> final List<ServerName> 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 && !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<RegionInfo, RegionStateNode> regions,<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span> final Map<ServerName, List<RegionInfo>> plan) throws HBaseIOException {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span> final ProcedureEvent<?>[] 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<ServerName, List<RegionInfo>> 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() && !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<RegionInfo, RegionStateNode> regions,<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span> List<RegionInfo> 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 &&<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<RegionInfo, RegionStateNode> regions,<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span> final HashMap<RegionInfo, ServerName> retainMap, final List<RegionInfo> hris,<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span> final List<ServerName> 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 && !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<RegionInfo, RegionStateNode> regions,<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span> final Map<ServerName, List<RegionInfo>> plan) throws HBaseIOException {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span> final ProcedureEvent<?>[] 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 + " -> " +<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<RegionInfo, RegionStateNode> regions,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span> final Collection<RegionInfo> 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<ServerName> 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<Pair<ServerName, String>> 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)->new Pair<>(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) -> 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)->!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<ServerName, Set<byte[]>> getRSReports() {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span> Map<ServerName, Set<byte[]>> rsReportsSnapshot = new HashMap<>();<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 -> 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<ServerName, List<RegionInfo>> 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) && 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 + " -> " +<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<RegionInfo, RegionStateNode> regions,<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span> final Collection<RegionInfo> 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<ServerName> 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<Pair<ServerName, String>> 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)->new Pair<>(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<RegionState> 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) -> 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)->!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<ServerName, Set<byte[]>> getRSReports() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span> Map<ServerName, Set<byte[]>> rsReportsSnapshot = new HashMap<>();<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 -> 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<RegionState> 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<RegionInfo, RegionStateNode> regions,<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span> final HashMap<RegionInfo, ServerName> retainMap, final List<RegionInfo> hris,<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span> final List<ServerName> 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 && !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<RegionInfo, RegionStateNode> regions,<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span> final Map<ServerName, List<RegionInfo>> plan) throws HBaseIOException {<a name="line.2013"></a>
-<span class="sourceLineNo">2014</span> final ProcedureEvent<?>[] 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<ServerName, List<RegionInfo>> 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() && !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<RegionInfo, RegionStateNode> regions,<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span> List<RegionInfo> 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 &&<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<RegionInfo, RegionStateNode> regions,<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span> final HashMap<RegionInfo, ServerName> retainMap, final List<RegionInfo> hris,<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span> final List<ServerName> 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 && !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<RegionInfo, RegionStateNode> regions,<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span> final Map<ServerName, List<RegionInfo>> plan) throws HBaseIOException {<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span> final ProcedureEvent<?>[] 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 + " -> " +<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<RegionInfo, RegionStateNode> regions,<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span> final Collection<RegionInfo> 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<ServerName> 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<Pair<ServerName, String>> 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)->new Pair<>(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) -> 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)->!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<ServerName, Set<byte[]>> getRSReports() {<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span> Map<ServerName, Set<byte[]>> rsReportsSnapshot = new HashMap<>();<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 -> 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<ServerName, List<RegionInfo>> 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) && 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 + " -> " +<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<RegionInfo, RegionStateNode> regions,<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span> final Collection<RegionInfo> 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<ServerName> 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<Pair<ServerName, String>> 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)->new Pair<>(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<RegionState> 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) -> 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)->!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<ServerName, Set<byte[]>> getRSReports() {<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span> Map<ServerName, Set<byte[]>> rsReportsSnapshot = new HashMap<>();<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 -> 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<RegionState> 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 ...