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/08/12 14:41:36 UTC

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

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 47c1366  Published site at 009851d680e1bb58791715d5d3ad0387b5efbc72.
47c1366 is described below

commit 47c1366ddb095735a3f5676c9fb92fbc51c4e622
Author: jenkins <bu...@apache.org>
AuthorDate: Mon Aug 12 14:41:06 2019 +0000

    Published site at 009851d680e1bb58791715d5d3ad0387b5efbc72.
---
 acid-semantics.html                                |     2 +-
 apache_hbase_reference_guide.pdf                   |     4 +-
 apidocs/deprecated-list.html                       |   230 +-
 apidocs/index-all.html                             |    37 +-
 .../hadoop/hbase/client/BufferedMutatorParams.html |     4 +-
 .../hadoop/hbase/client/SnapshotDescription.html   |   193 +-
 apidocs/org/apache/hadoop/hbase/client/Table.html  |    11 +
 .../client/class-use/BufferedMutatorParams.html    |     2 +-
 .../hbase/client/class-use/SnapshotType.html       |    40 +-
 .../hadoop/hbase/mapred/TableOutputFormat.html     |     4 +-
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html |    28 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html      |    10 +-
 .../hadoop/hbase/client/BufferedMutatorParams.html |     2 +-
 .../hadoop/hbase/client/SnapshotDescription.html   |   255 +-
 .../org/apache/hadoop/hbase/client/Table.html      |    14 +-
 .../hadoop/hbase/mapred/TableOutputFormat.html     |   147 +-
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html |  1768 ++-
 .../hadoop/hbase/snapshot/ExportSnapshot.html      |  1753 +--
 book.html                                          |     2 +-
 bulk-loads.html                                    |     2 +-
 checkstyle-aggregate.html                          | 12114 +++++++++----------
 checkstyle.rss                                     |    10 +-
 coc.html                                           |     2 +-
 dependencies.html                                  |     2 +-
 dependency-convergence.html                        |     2 +-
 dependency-info.html                               |     2 +-
 dependency-management.html                         |     2 +-
 devapidocs/constant-values.html                    |     4 +-
 devapidocs/deprecated-list.html                    |   414 +-
 devapidocs/index-all.html                          |    79 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |     4 +-
 .../hadoop/hbase/class-use/HTableDescriptor.html   |    18 -
 .../hadoop/hbase/client/BufferedMutatorParams.html |     4 +-
 ...leRequestController.RequestHeapSizeChecker.html |    14 +-
 ...SimpleRequestController.RequestRowsChecker.html |    14 +-
 .../client/SimpleRequestController.RowChecker.html |     8 +-
 .../SimpleRequestController.TaskCountChecker.html  |    11 +-
 .../hadoop/hbase/client/SnapshotDescription.html   |   197 +-
 .../org/apache/hadoop/hbase/client/Table.html      |    11 +
 .../hbase/client/class-use/BufferedMutator.html    |    17 -
 .../client/class-use/BufferedMutatorParams.html    |     2 +-
 .../hbase/client/class-use/SnapshotType.html       |    40 +-
 .../hbase/client/coprocessor/Batch.Call.html       |     2 +-
 .../apache/hadoop/hbase/client/package-tree.html   |    20 +-
 .../hadoop/hbase/coprocessor/package-tree.html     |     2 +-
 .../hbase/exceptions/ClientExceptionsUtil.html     |    50 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |     4 +-
 .../io/hfile/bucket/BucketCache.RAMCache.html      |    14 +-
 .../class-use/BucketCache.RAMQueueEntry.html       |     4 +-
 .../hbase/io/hfile/class-use/BlockCacheKey.html    |     4 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |     6 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |     2 +-
 .../TableOutputFormat.TableRecordWriter.html       |    36 +-
 .../hadoop/hbase/mapred/TableOutputFormat.html     |     4 +-
 .../mapreduce/HFileOutputFormat2.TableInfo.html    |    49 +-
 .../mapreduce/HFileOutputFormat2.WriterLength.html |     8 +-
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html |    82 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |     4 +-
 .../hbase/master/assignment/RegionStateNode.html   |     4 +-
 .../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       |     4 +-
 .../org/apache/hadoop/hbase/package-tree.html      |    18 +-
 .../hadoop/hbase/procedure2/package-tree.html      |     4 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |     6 +-
 .../apache/hadoop/hbase/regionserver/HRegion.html  |     4 +-
 .../hadoop/hbase/regionserver/HStoreFile.html      |   109 +-
 .../hadoop/hbase/regionserver/StoreFile.html       |    58 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    16 +-
 .../regionserver/querymatcher/package-tree.html    |     2 +-
 .../hbase/regionserver/wal/package-tree.html       |     2 +-
 .../hadoop/hbase/replication/package-tree.html     |     2 +-
 .../replication/regionserver/package-tree.html     |     2 +-
 .../hadoop/hbase/rest/model/package-tree.html      |     2 +-
 .../hbase/security/access/AccessController.html    |   198 +-
 .../hadoop/hbase/security/access/package-tree.html |     6 +-
 .../apache/hadoop/hbase/security/package-tree.html |     2 +-
 .../snapshot/ExportSnapshot.ExportMapper.html      |    28 +-
 ...apshotInputFormat.ExportSnapshotInputSplit.html |    20 +-
 ...shotInputFormat.ExportSnapshotRecordReader.html |    24 +-
 .../ExportSnapshot.ExportSnapshotInputFormat.html  |     8 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html      |    48 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |     4 +-
 .../hadoop/hbase/tool/BulkLoadHFilesTool.html      |    39 +-
 .../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  |     4 +-
 .../hadoop/hbase/client/BufferedMutatorParams.html |     2 +-
 ...leRequestController.RequestHeapSizeChecker.html |   287 +-
 ...SimpleRequestController.RequestRowsChecker.html |   287 +-
 .../client/SimpleRequestController.RowChecker.html |   287 +-
 ...mpleRequestController.SubmittedSizeChecker.html |   287 +-
 .../SimpleRequestController.TaskCountChecker.html  |   287 +-
 .../hbase/client/SimpleRequestController.html      |   287 +-
 .../hadoop/hbase/client/SnapshotDescription.html   |   255 +-
 .../hbase/client/Table.CheckAndMutateBuilder.html  |    14 +-
 .../org/apache/hadoop/hbase/client/Table.html      |    14 +-
 .../hbase/client/coprocessor/Batch.Call.html       |     2 +-
 .../hbase/client/coprocessor/Batch.Callback.html   |     2 +-
 .../hadoop/hbase/client/coprocessor/Batch.html     |     2 +-
 .../hbase/exceptions/ClientExceptionsUtil.html     |   348 +-
 .../hfile/bucket/BucketCache.BucketEntryGroup.html |    10 +-
 .../io/hfile/bucket/BucketCache.RAMCache.html      |    10 +-
 .../io/hfile/bucket/BucketCache.RAMQueueEntry.html |    10 +-
 .../hfile/bucket/BucketCache.StatisticsThread.html |    10 +-
 .../io/hfile/bucket/BucketCache.WriterThread.html  |    10 +-
 .../hadoop/hbase/io/hfile/bucket/BucketCache.html  |    10 +-
 .../TableOutputFormat.TableRecordWriter.html       |   147 +-
 .../hadoop/hbase/mapred/TableOutputFormat.html     |   147 +-
 .../mapreduce/HFileOutputFormat2.TableInfo.html    |  1768 ++-
 .../mapreduce/HFileOutputFormat2.WriterLength.html |  1768 ++-
 .../hadoop/hbase/mapreduce/HFileOutputFormat2.html |  1768 ++-
 .../RegionStateNode.AssignmentProcedureEvent.html  |     2 +-
 .../hbase/master/assignment/RegionStateNode.html   |     2 +-
 .../HRegion.BatchOperation.Visitor.html            |     4 +-
 .../hbase/regionserver/HRegion.BatchOperation.html |     4 +-
 .../regionserver/HRegion.BulkLoadListener.html     |     4 +-
 .../regionserver/HRegion.FlushResult.Result.html   |     4 +-
 .../hbase/regionserver/HRegion.FlushResult.html    |     4 +-
 .../regionserver/HRegion.FlushResultImpl.html      |     4 +-
 .../HRegion.MutationBatchOperation.html            |     4 +-
 .../HRegion.ObservedExceptionsInBatch.html         |     4 +-
 .../regionserver/HRegion.PrepareFlushResult.html   |     4 +-
 .../regionserver/HRegion.RegionScannerImpl.html    |     4 +-
 .../regionserver/HRegion.ReplayBatchOperation.html |     4 +-
 .../hbase/regionserver/HRegion.RowLockContext.html |     4 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html    |     4 +-
 .../hbase/regionserver/HRegion.WriteState.html     |     4 +-
 .../apache/hadoop/hbase/regionserver/HRegion.html  |     4 +-
 .../hadoop/hbase/regionserver/HStoreFile.html      |   619 +-
 .../hadoop/hbase/regionserver/StoreFile.html       |    75 +-
 .../security/access/AccessController.OpType.html   |  2999 ++---
 .../hbase/security/access/AccessController.html    |  2999 ++---
 .../hbase/snapshot/ExportSnapshot.Counter.html     |  1753 +--
 .../snapshot/ExportSnapshot.ExportMapper.html      |  1753 +--
 ...apshotInputFormat.ExportSnapshotInputSplit.html |  1753 +--
 ...shotInputFormat.ExportSnapshotRecordReader.html |  1753 +--
 .../ExportSnapshot.ExportSnapshotInputFormat.html  |  1753 +--
 .../hbase/snapshot/ExportSnapshot.Options.html     |  1753 +--
 .../hbase/snapshot/ExportSnapshot.Testing.html     |  1753 +--
 .../hadoop/hbase/snapshot/ExportSnapshot.html      |  1753 +--
 .../tool/BulkLoadHFilesTool.BulkHFileVisitor.html  |  1191 +-
 .../hadoop/hbase/tool/BulkLoadHFilesTool.html      |  1191 +-
 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 +-
 .../apache/hadoop/hbase/HBaseTestingUtility.html   |   135 +-
 .../apache/hadoop/hbase/HBaseTestingUtility.html   |  2285 ++--
 testdevapidocs/index-all.html                      |     5 +-
 ...Utility.PortAllocator.AvailablePortChecker.html |     4 +-
 .../hbase/HBaseTestingUtility.PortAllocator.html   |    20 +-
 .../apache/hadoop/hbase/HBaseTestingUtility.html   |   141 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |     2 +-
 .../hadoop/hbase/master/MockRegionServer.html      |   194 +-
 .../org/apache/hadoop/hbase/package-tree.html      |    12 +-
 .../hadoop/hbase/procedure/package-tree.html       |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html      |     4 +-
 .../hadoop/hbase/regionserver/MockHStoreFile.html  |    61 +-
 .../hadoop/hbase/regionserver/package-tree.html    |     6 +-
 .../snapshot/TestFlushSnapshotFromClient.html      |     2 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |     4 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |     4 +-
 ...Utility.PortAllocator.AvailablePortChecker.html |  2285 ++--
 .../hbase/HBaseTestingUtility.PortAllocator.html   |  2285 ++--
 .../hbase/HBaseTestingUtility.SeenRowTracker.html  |  2285 ++--
 .../apache/hadoop/hbase/HBaseTestingUtility.html   |  2285 ++--
 ...FileOutputFormat2.RandomKVGeneratingMapper.html |     2 +-
 ...ileOutputFormat2.RandomPutGeneratingMapper.html |     2 +-
 .../hbase/mapreduce/TestHFileOutputFormat2.html    |     2 +-
 .../MockRegionServer.RegionNameAndIndex.html       |  1063 +-
 .../hadoop/hbase/master/MockRegionServer.html      |  1063 +-
 .../hadoop/hbase/regionserver/MockHStoreFile.html  |   161 +-
 .../snapshot/TestFlushSnapshotFromClient.html      |     2 +-
 191 files changed, 31481 insertions(+), 32468 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index c8c6407..78a74fd 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -450,7 +450,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-12</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 215dbea..3ab637c 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:20190810143823+00'00')
-/CreationDate (D:20190810143823+00'00')
+/ModDate (D:20190812143812+00'00')
+/CreationDate (D:20190812143812+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/deprecated-list.html b/apidocs/deprecated-list.html
index 6577884..f56a765 100644
--- a/apidocs/deprecated-list.html
+++ b/apidocs/deprecated-list.html
@@ -1282,483 +1282,477 @@
 </td>
 </tr>
 <tr class="altColor">
-<td class="colOne"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#getTable--">org.apache.hadoop.hbase.client.SnapshotDescription.getTable()</a>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableName--"><code>SnapshotDescription.getTableName()</code></a> or
-   <a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableNameAsString--"><code>SnapshotDescription.getTableNameAsString()</code></a> instead.</span></div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#getTable-byte:A-">org.apache.hadoop.hbase.HRegionInfo.getTable(byte[])</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#getTable-byte:A-"><code>RegionInfo.getTable(byte[])</code></a>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#getTag-org.apache.hadoop.hbase.Cell-byte-">org.apache.hadoop.hbase.CellUtil.getTag(Cell, byte)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <code>RawCell.getTag(byte)</code></span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#getTagArray-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.getTagArray(Cell)</a>
 <div class="block"><span class="deprecationComment">As of HBase-2.0. Will be removed in HBase-3.0</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#getTags-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.getTags(Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <code>RawCell.getTags()</code></span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/Cell.html#getTagsArray--">org.apache.hadoop.hbase.Cell.getTagsArray()</a>
 <div class="block"><span class="deprecationComment">As of HBase-2.0. Will be removed in HBase-3.0. Tags are are now internal.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/Cell.html#getTagsLength--">org.apache.hadoop.hbase.Cell.getTagsLength()</a>
 <div class="block"><span class="deprecationComment">As of HBase-2.0. Will be removed in HBase-3.0. Tags are are now internal.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/Cell.html#getTagsOffset--">org.apache.hadoop.hbase.Cell.getTagsOffset()</a>
 <div class="block"><span class="deprecationComment">As of HBase-2.0. Will be removed in HBase-3.0. Tags are are now internal.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Mutation.html#getTimeStamp--">org.apache.hadoop.hbase.client.Mutation.getTimeStamp()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/client/Mutation.html#getTimestamp--"><code>Mutation.getTimestamp()</code></a> instead</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#getTotalCompactingKVs--">org.apache.hadoop.hbase.ServerLoad.getTotalCompactingKVs()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
      Use <a href="org/apache/hadoop/hbase/ServerLoad.html#getRegionMetrics--"><code>ServerLoad.getRegionMetrics()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/RegionLoad.html#getTotalCompactingKVs--">org.apache.hadoop.hbase.RegionLoad.getTotalCompactingKVs()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/RegionLoad.html#getCompactingCellCount--"><code>RegionLoad.getCompactingCellCount()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#getTotalNumberOfRequests--">org.apache.hadoop.hbase.ServerLoad.getTotalNumberOfRequests()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/ServerLoad.html#getRequestCount--"><code>ServerLoad.getRequestCount()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#getTotalStaticBloomSizeKB--">org.apache.hadoop.hbase.ServerLoad.getTotalStaticBloomSizeKB()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
      Use <a href="org/apache/hadoop/hbase/ServerLoad.html#getRegionMetrics--"><code>ServerLoad.getRegionMetrics()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/RegionLoad.html#getTotalStaticBloomSizeKB--">org.apache.hadoop.hbase.RegionLoad.getTotalStaticBloomSizeKB()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/RegionLoad.html#getBloomFilterSize--"><code>RegionLoad.getBloomFilterSize()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#getTotalStaticIndexSizeKB--">org.apache.hadoop.hbase.ServerLoad.getTotalStaticIndexSizeKB()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
      Use <a href="org/apache/hadoop/hbase/ServerLoad.html#getRegionMetrics--"><code>ServerLoad.getRegionMetrics()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/RegionLoad.html#getTotalStaticIndexSizeKB--">org.apache.hadoop.hbase.RegionLoad.getTotalStaticIndexSizeKB()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/RegionLoad.html#getStoreFileUncompressedDataIndexSize--"><code>RegionLoad.getStoreFileUncompressedDataIndexSize()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/Cell.html#getTypeByte--">org.apache.hadoop.hbase.Cell.getTypeByte()</a>
 <div class="block"><span class="deprecationComment">As of HBase-2.0. Will be removed in HBase-3.0. Use <a href="org/apache/hadoop/hbase/Cell.html#getType--"><code>Cell.getType()</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#getUsedHeapMB--">org.apache.hadoop.hbase.ServerLoad.getUsedHeapMB()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/ServerLoad.html#getUsedHeapSize--"><code>ServerLoad.getUsedHeapSize()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#getValueBufferShallowCopy-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.getValueBufferShallowCopy(Cell)</a>
 <div class="block"><span class="deprecationComment">As of HBase-2.0. Will be removed in 3.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ClusterStatus.html#getVersion--">org.apache.hadoop.hbase.ClusterStatus.getVersion()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html#getWriteBufferPeriodicFlushTimerTickMs--">org.apache.hadoop.hbase.client.BufferedMutatorParams.getWriteBufferPeriodicFlushTimerTickMs()</a>
 <div class="block"><span class="deprecationComment">Since 3.0.0, will be removed in 4.0.0. We use a common timer in the whole client
              implementation so you can not set it any more.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#getWriteRequestsCount--">org.apache.hadoop.hbase.ServerLoad.getWriteRequestsCount()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
      Use <a href="org/apache/hadoop/hbase/ServerLoad.html#getRegionMetrics--"><code>ServerLoad.getRegionMetrics()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/RegionLoad.html#getWriteRequestsCount--">org.apache.hadoop.hbase.RegionLoad.getWriteRequestsCount()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/RegionLoad.html#getWriteRequestCount--"><code>RegionLoad.getWriteRequestCount()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/RowMutations.html#hashCode--">org.apache.hadoop.hbase.client.RowMutations.hashCode()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              No replacement</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#hasMaxHeapMB--">org.apache.hadoop.hbase.ServerLoad.hasMaxHeapMB()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              No flag in 2.0</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#hasNumberOfRequests--">org.apache.hadoop.hbase.ServerLoad.hasNumberOfRequests()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              No flag in 2.0</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HTableDescriptor.html#hasRegionMemstoreReplication--">org.apache.hadoop.hbase.HTableDescriptor.hasRegionMemstoreReplication()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/HTableDescriptor.html#hasRegionMemStoreReplication--"><code>HTableDescriptor.hasRegionMemStoreReplication()</code></a> instead</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#hasTotalNumberOfRequests--">org.apache.hadoop.hbase.ServerLoad.hasTotalNumberOfRequests()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              No flag in 2.0</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#hasUsedHeapMB--">org.apache.hadoop.hbase.ServerLoad.hasUsedHeapMB()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              No flag in 2.0</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html#implementationClassName-java.lang.String-">org.apache.hadoop.hbase.client.BufferedMutatorParams.implementationClassName(String)</a>
 <div class="block"><span class="deprecationComment">Since 3.0.0, will be removed in 4.0.0. You can not set it any more as the
              implementation has to use too many internal stuffs in HBase.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initCredentialsForCluster-org.apache.hadoop.mapreduce.Job-java.lang.String-">org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.initCredentialsForCluster(Job, String)</a>
 <div class="block"><span class="deprecationComment">Since 1.2.0 and will be removed in 3.0.0. Use
    <a href="org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initCredentialsForCluster-org.apache.hadoop.mapreduce.Job-org.apache.hadoop.conf.Configuration-"><code>TableMapReduceUtil.initCredentialsForCluster(Job, Configuration)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ClusterStatus.html#isBalancerOn--">org.apache.hadoop.hbase.ClusterStatus.isBalancerOn()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              No flag in 2.0</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#isDelete-byte-">org.apache.hadoop.hbase.CellUtil.isDelete(byte)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#isDeleteColumnOrFamily-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.isDeleteColumnOrFamily(Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#isDeleteColumns-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.isDeleteColumns(Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#isDeleteColumnVersion-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.isDeleteColumnVersion(Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#isDeleteFamily-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.isDeleteFamily(Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#isDeleteFamilyVersion-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.isDeleteFamilyVersion(Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#isDeleteType-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.isDeleteType(Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#isEncodedRegionName-byte:A-">org.apache.hadoop.hbase.HRegionInfo.isEncodedRegionName(byte[])</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#isEncodedRegionName-byte:A-"><code>RegionInfo.isEncodedRegionName(byte[])</code></a>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HColumnDescriptor.html#isLegalFamilyName-byte:A-">org.apache.hadoop.hbase.HColumnDescriptor.isLegalFamilyName(byte[])</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use
    <a href="org/apache/hadoop/hbase/client/ColumnFamilyDescriptorBuilder.html#isLegalColumnFamilyName-byte:A-"><code>ColumnFamilyDescriptorBuilder.isLegalColumnFamilyName(byte[])</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#isSmall--">org.apache.hadoop.hbase.client.Scan.isSmall()</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. See the comment of
    <a href="org/apache/hadoop/hbase/client/Scan.html#setSmall-boolean-"><code>Scan.setSmall(boolean)</code></a></span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingColumn-org.apache.hadoop.hbase.Cell-byte:A-int-int-byte:A-int-int-">org.apache.hadoop.hbase.CellUtil.matchingColumn(Cell, byte[], int, int, byte[], int, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingFamily-org.apache.hadoop.hbase.Cell-byte:A-int-int-">org.apache.hadoop.hbase.CellUtil.matchingFamily(Cell, byte[], int, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingQualifier-org.apache.hadoop.hbase.Cell-byte:A-int-int-">org.apache.hadoop.hbase.CellUtil.matchingQualifier(Cell, byte[], int, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingRow-org.apache.hadoop.hbase.Cell-byte:A-">org.apache.hadoop.hbase.CellUtil.matchingRow(Cell, byte[])</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Instead use <a href="org/apache/hadoop/hbase/CellUtil.html#matchingRows-org.apache.hadoop.hbase.Cell-byte:A-"><code>CellUtil.matchingRows(Cell, byte[])</code></a></span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingRow-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.matchingRow(Cell, Cell)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Instead use <a href="org/apache/hadoop/hbase/CellUtil.html#matchingRows-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-"><code>CellUtil.matchingRows(Cell, Cell)</code></a></span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingType-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">org.apache.hadoop.hbase.CellUtil.matchingType(Cell, Cell)</a>
 <div class="block"><span class="deprecationComment">As of HBase-2.0. Will be removed in HBase-3.0</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Admin.html#move-byte:A-byte:A-">org.apache.hadoop.hbase.client.Admin.move(byte[], byte[])</a>
 <div class="block"><span class="deprecationComment">since 2.2.0 and will be removed in 4.0.0. Use <a href="org/apache/hadoop/hbase/client/Admin.html#move-byte:A-org.apache.hadoop.hbase.ServerName-"><code>Admin.move(byte[], ServerName)</code></a>
    instead. And if you want to move the region to a random server, please use
    <a href="org/apache/hadoop/hbase/client/Admin.html#move-byte:A-"><code>Admin.move(byte[])</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerLoad.html#obtainServerLoadPB--">org.apache.hadoop.hbase.ServerLoad.obtainServerLoadPB()</a>
 <div class="block"><span class="deprecationComment">DONT use this pb object since the byte array backed may be modified in rpc layer</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html#opertationTimeout-int-">org.apache.hadoop.hbase.client.BufferedMutatorParams.opertationTimeout(int)</a>
-<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <code>#operationTimeout()</code></span></div>
+<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html#operationTimeout-int-"><code>BufferedMutatorParams.operationTimeout(int)</code></a></span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#overlappingKeys-byte:A-byte:A-byte:A-byte:A-">org.apache.hadoop.hbase.CellUtil.overlappingKeys(byte[], byte[], byte[], byte[])</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#parseDelimitedFrom-byte:A-int-int-">org.apache.hadoop.hbase.HRegionInfo.parseDelimitedFrom(byte[], int, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#parseDelimitedFrom-byte:A-int-int-"><code>RegionInfo.parseDelimitedFrom(byte[], int, int)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#parseFrom-byte:A-">org.apache.hadoop.hbase.HRegionInfo.parseFrom(byte[])</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#parseFrom-byte:A-"><code>RegionInfo.parseFrom(byte[])</code></a>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#parseFrom-byte:A-int-int-">org.apache.hadoop.hbase.HRegionInfo.parseFrom(byte[], int, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#parseFrom-byte:A-int-int-"><code>RegionInfo.parseFrom(byte[], int, int)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#parseFrom-java.io.DataInputStream-">org.apache.hadoop.hbase.HRegionInfo.parseFrom(DataInputStream)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#parseFrom-java.io.DataInputStream-"><code>RegionInfo.parseFrom(DataInputStream)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#parseFromOrNull-byte:A-">org.apache.hadoop.hbase.HRegionInfo.parseFromOrNull(byte[])</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#parseFromOrNull-byte:A-"><code>RegionInfo.parseFromOrNull(byte[])</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#parseFromOrNull-byte:A-int-int-">org.apache.hadoop.hbase.HRegionInfo.parseFromOrNull(byte[], int, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#parseFromOrNull-byte:A-int-int-"><code>RegionInfo.parseFromOrNull(byte[], int, int)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerName.html#parseHostname-java.lang.String-">org.apache.hadoop.hbase.ServerName.parseHostname(String)</a>
 <div class="block"><span class="deprecationComment">Since 2.0. Use <a href="org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>ServerName.valueOf(String)</code></a></span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerName.html#parsePort-java.lang.String-">org.apache.hadoop.hbase.ServerName.parsePort(String)</a>
 <div class="block"><span class="deprecationComment">Since 2.0. Use <a href="org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>ServerName.valueOf(String)</code></a></span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#parseRegionName-byte:A-">org.apache.hadoop.hbase.HRegionInfo.parseRegionName(byte[])</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#parseRegionName-byte:A-"><code>RegionInfo.parseRegionName(byte[])</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/ServerName.html#parseStartcode-java.lang.String-">org.apache.hadoop.hbase.ServerName.parseStartcode(String)</a>
 <div class="block"><span class="deprecationComment">Since 2.0. Use <a href="org/apache/hadoop/hbase/ServerName.html#valueOf-java.lang.String-"><code>ServerName.valueOf(String)</code></a></span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#prettyPrint-java.lang.String-">org.apache.hadoop.hbase.HRegionInfo.prettyPrint(String)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#prettyPrint-java.lang.String-"><code>RegionInfo.prettyPrint(String)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#setAsyncPrefetch-boolean-">org.apache.hadoop.hbase.client.Scan.setAsyncPrefetch(boolean)</a>
 <div class="block"><span class="deprecationComment">Since 3.0.0, will be removed in 4.0.0. After building sync client upon async
              client, the implementation is always 'async prefetch', so this flag is useless now.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setBandwidth-long-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setBandwidth(long)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setBandwidth-long-"><code>ReplicationPeerConfigBuilder.setBandwidth(long)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HColumnDescriptor.html#setCacheDataInL1-boolean-">org.apache.hadoop.hbase.HColumnDescriptor.setCacheDataInL1(boolean)</a>
 <div class="block"><span class="deprecationComment">Since 2.0 and will be removed in 3.0 with out any replacement. Caching data in on
              heap Cache, when there are both on heap LRU Cache and Bucket Cache will no longer
              be supported from 2.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setClusterKey-java.lang.String-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setClusterKey(String)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setClusterKey-java.lang.String-"><code>ReplicationPeerConfigBuilder.setClusterKey(String)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setExcludeNamespaces-java.util.Set-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setExcludeNamespaces(Set&lt;String&gt;)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setExcludeNamespaces-java.util.Set-"><code>ReplicationPeerConfigBuilder.setExcludeNamespaces(Set)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setExcludeTableCFsMap-java.util.Map-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setExcludeTableCFsMap(Map&lt;TableName, ? extends Collection&lt;String&gt;&gt;)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setExcludeTableCFsMap-java.util.Map-"><code>ReplicationPeerConfigBuilder.setExcludeTableCFsMap(Map)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Mutation.html#setFamilyCellMap-java.util.NavigableMap-">org.apache.hadoop.hbase.client.Mutation.setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt;)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/client/Mutation.html#Mutation-byte:A-long-java.util.NavigableMap-"><code>Mutation.Mutation(byte[], long, NavigableMap)</code></a> instead</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Put.html#setFamilyCellMap-java.util.NavigableMap-">org.apache.hadoop.hbase.client.Put.setFamilyCellMap(NavigableMap&lt;byte[], List&lt;Cell&gt;&gt;)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/client/Put.html#Put-byte:A-long-java.util.NavigableMap-"><code>Put.Put(byte[], long, NavigableMap)</code></a> instead</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#setMaxVersions--">org.apache.hadoop.hbase.client.Scan.setMaxVersions()</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column
    family's max versions, so use <a href="org/apache/hadoop/hbase/client/Scan.html#readAllVersions--"><code>Scan.readAllVersions()</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#setMaxVersions-int-">org.apache.hadoop.hbase.client.Scan.setMaxVersions(int)</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. It is easy to misunderstand with column
    family's max versions, so use <a href="org/apache/hadoop/hbase/client/Scan.html#readVersions-int-"><code>Scan.readVersions(int)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setNamespaces-java.util.Set-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setNamespaces(Set&lt;String&gt;)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setNamespaces-java.util.Set-"><code>ReplicationPeerConfigBuilder.setNamespaces(Set)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/BufferedMutator.html#setOperationTimeout-int-">org.apache.hadoop.hbase.client.BufferedMutator.setOperationTimeout(int)</a>
 <div class="block"><span class="deprecationComment">Since 3.0.0, will be removed in 4.0.0. Please set this through the
              <a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html" title="class in org.apache.hadoop.hbase.client"><code>BufferedMutatorParams</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HTableDescriptor.html#setOwner-org.apache.hadoop.hbase.security.User-">org.apache.hadoop.hbase.HTableDescriptor.setOwner(User)</a>
 <div class="block"><span class="deprecationComment">since 0.94.1</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#setOwner-org.apache.hadoop.hbase.security.User-">org.apache.hadoop.hbase.client.TableDescriptorBuilder.setOwner(User)</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HTableDescriptor.html#setOwnerString-java.lang.String-">org.apache.hadoop.hbase.HTableDescriptor.setOwnerString(String)</a>
 <div class="block"><span class="deprecationComment">since 0.94.1</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/TableDescriptorBuilder.html#setOwnerString-java.lang.String-">org.apache.hadoop.hbase.client.TableDescriptorBuilder.setOwnerString(String)</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HTableDescriptor.html#setRegionMemstoreReplication-boolean-">org.apache.hadoop.hbase.HTableDescriptor.setRegionMemstoreReplication(boolean)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/HTableDescriptor.html#setRegionMemStoreReplication-boolean-"><code>HTableDescriptor.setRegionMemStoreReplication(boolean)</code></a> instead</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setReplicateAllUserTables-boolean-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setReplicateAllUserTables(boolean)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setReplicateAllUserTables-boolean-"><code>ReplicationPeerConfigBuilder.setReplicateAllUserTables(boolean)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setReplicationEndpointImpl-java.lang.String-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setReplicationEndpointImpl(String)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setReplicationEndpointImpl-java.lang.String-"><code>ReplicationPeerConfigBuilder.setReplicationEndpointImpl(String)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/BufferedMutator.html#setRpcTimeout-int-">org.apache.hadoop.hbase.client.BufferedMutator.setRpcTimeout(int)</a>
 <div class="block"><span class="deprecationComment">Since 3.0.0, will be removed in 4.0.0. Please set this through the
              <a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html" title="class in org.apache.hadoop.hbase.client"><code>BufferedMutatorParams</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#setSequenceId-org.apache.hadoop.hbase.Cell-long-">org.apache.hadoop.hbase.CellUtil.setSequenceId(Cell, long)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#setSmall-boolean-">org.apache.hadoop.hbase.client.Scan.setSmall(boolean)</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="org/apache/hadoop/hbase/client/Scan.html#setLimit-int-"><code>Scan.setLimit(int)</code></a> and
    <a href="org/apache/hadoop/hbase/client/Scan.html#setReadType-org.apache.hadoop.hbase.client.Scan.ReadType-"><code>Scan.setReadType(ReadType)</code></a> instead. And for the one rpc optimization, now we will also
@@ -1766,94 +1760,94 @@
    the scanner automatically which means we will fall back to one rpc.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#setStartRow-byte:A-">org.apache.hadoop.hbase.client.Scan.setStartRow(byte[])</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="org/apache/hadoop/hbase/client/Scan.html#withStartRow-byte:A-"><code>Scan.withStartRow(byte[])</code></a>
    instead. This method may change the inclusive of the stop row to keep compatible with the old
    behavior.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#setStopRow-byte:A-">org.apache.hadoop.hbase.client.Scan.setStopRow(byte[])</a>
 <div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="org/apache/hadoop/hbase/client/Scan.html#withStopRow-byte:A-"><code>Scan.withStopRow(byte[])</code></a> instead.
    This method may change the inclusive of the stop row to keep compatible with the old
    behavior.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfig.html#setTableCFsMap-java.util.Map-">org.apache.hadoop.hbase.replication.ReplicationPeerConfig.setTableCFsMap(Map&lt;TableName, ? extends Collection&lt;String&gt;&gt;)</a>
 <div class="block"><span class="deprecationComment">as release of 2.0.0, and it will be removed in 3.0.0. Use
              <a href="org/apache/hadoop/hbase/replication/ReplicationPeerConfigBuilder.html#setTableCFsMap-java.util.Map-"><code>ReplicationPeerConfigBuilder.setTableCFsMap(Map)</code></a> instead.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/Scan.html#setTimeStamp-long-">org.apache.hadoop.hbase.client.Scan.setTimeStamp(long)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.
              Use <a href="org/apache/hadoop/hbase/client/Scan.html#setTimestamp-long-"><code>Scan.setTimestamp(long)</code></a> instead</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html#setWriteBufferPeriodicFlushTimerTickMs-long-">org.apache.hadoop.hbase.client.BufferedMutatorParams.setWriteBufferPeriodicFlushTimerTickMs(long)</a>
 <div class="block"><span class="deprecationComment">Since 3.0.0, will be removed in 4.0.0. We use a common timer in the whole client
              implementation so you can not set it any more.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#tagsIterator-byte:A-int-int-">org.apache.hadoop.hbase.CellUtil.tagsIterator(byte[], int, int)</a>
 <div class="block"><span class="deprecationComment">As of 2.0.0 and will be removed in 3.0.0
              Instead use <code>PrivateCellUtil.tagsIterator(Cell)</code></span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#toByteArray--">org.apache.hadoop.hbase.HRegionInfo.toByteArray()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#toByteArray-org.apache.hadoop.hbase.client.RegionInfo-"><code>RegionInfo.toByteArray(RegionInfo)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#toDelimitedByteArray--">org.apache.hadoop.hbase.HRegionInfo.toDelimitedByteArray()</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#toDelimitedByteArray-org.apache.hadoop.hbase.client.RegionInfo-"><code>RegionInfo.toDelimitedByteArray(RegionInfo)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/HRegionInfo.html#toDelimitedByteArray-org.apache.hadoop.hbase.HRegionInfo...-">org.apache.hadoop.hbase.HRegionInfo.toDelimitedByteArray(HRegionInfo...)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0
              Use <a href="org/apache/hadoop/hbase/client/RegionInfo.html#toDelimitedByteArray-org.apache.hadoop.hbase.client.RegionInfo...-"><code>RegionInfo.toDelimitedByteArray(RegionInfo...)</code></a>.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#updateLatestStamp-org.apache.hadoop.hbase.Cell-byte:A-int-">org.apache.hadoop.hbase.CellUtil.updateLatestStamp(Cell, byte[], int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#updateLatestStamp-org.apache.hadoop.hbase.Cell-long-">org.apache.hadoop.hbase.CellUtil.updateLatestStamp(Cell, long)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-byte:A-int-">org.apache.hadoop.hbase.io.TimeRange.withinTimeRange(byte[], int)</a>
 <div class="block"><span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
    changed to private or removed in 3.0. Use <a href="org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-long-"><code>TimeRange.withinTimeRange(long)</code></a> instead</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#writeFlatKey-org.apache.hadoop.hbase.Cell-java.io.OutputStream-">org.apache.hadoop.hbase.CellUtil.writeFlatKey(Cell, OutputStream)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#writeQualifierSkippingBytes-java.io.DataOutputStream-org.apache.hadoop.hbase.Cell-int-int-">org.apache.hadoop.hbase.CellUtil.writeQualifierSkippingBytes(DataOutputStream, Cell, int, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#writeRowKeyExcludingCommon-org.apache.hadoop.hbase.Cell-short-int-java.io.DataOutputStream-">org.apache.hadoop.hbase.CellUtil.writeRowKeyExcludingCommon(Cell, short, int, DataOutputStream)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/CellUtil.html#writeRowSkippingBytes-java.io.DataOutputStream-org.apache.hadoop.hbase.Cell-short-int-">org.apache.hadoop.hbase.CellUtil.writeRowSkippingBytes(DataOutputStream, Cell, short, int)</a>
 <div class="block"><span class="deprecationComment">As of release 2.0.0, this will be removed in HBase 3.0.0.</span></div>
 </td>
@@ -1944,30 +1938,6 @@
 </td>
 </tr>
 <tr class="altColor">
-<td class="colOne"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-">org.apache.hadoop.hbase.client.SnapshotDescription(String, String)</a>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</td>
-</tr>
-<tr class="rowColor">
-<td class="colOne"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-">org.apache.hadoop.hbase.client.SnapshotDescription(String, String, SnapshotType)</a>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</td>
-</tr>
-<tr class="altColor">
-<td class="colOne"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">org.apache.hadoop.hbase.client.SnapshotDescription(String, String, SnapshotType, String)</a>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</td>
-</tr>
-<tr class="rowColor">
-<td class="colOne"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-">org.apache.hadoop.hbase.client.SnapshotDescription(String, String, SnapshotType, String, long, int)</a>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colOne"><a href="org/apache/hadoop/hbase/io/TimeRange.html#TimeRange--">org.apache.hadoop.hbase.io.TimeRange()</a>
 <div class="block"><span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index e2d438f..798c74f 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -8356,13 +8356,6 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/replication/TableCFs.html#getTable--">getTable()</a></span> - Method in class org.apache.hadoop.hbase.client.replication.<a href="org/apache/hadoop/hbase/client/replication/TableCFs.html" title="class in org.apache.hadoop.hbase.client.replication">TableCFs</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#getTable--">getTable()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a></dt>
-<dd>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableName--"><code>SnapshotDescription.getTableName()</code></a> or
-   <a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableNameAsString--"><code>SnapshotDescription.getTableNameAsString()</code></a> instead.</span></div>
-</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HRegionInfo.html#getTable-byte:A-">getTable(byte[])</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>
@@ -12727,7 +12720,7 @@
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html#opertationTimeout-int-">opertationTimeout(int)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html" title="class in org.apache.hadoop.hbase.client">BufferedMutatorParams</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>
-<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <code>#operationTimeout()</code></span></div>
+<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <a href="org/apache/hadoop/hbase/client/BufferedMutatorParams.html#operationTimeout-int-"><code>BufferedMutatorParams.operationTimeout(int)</code></a></span></div>
 </div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/ParseConstants.html#OR">OR</a></span> - Static variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/ParseConstants.html" title="class in org.apache.hadoop.hbase.filter">ParseConstants</a></dt>
@@ -17074,40 +17067,12 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-">SnapshotDescription(String)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-">SnapshotDescription(String, String)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a></dt>
-<dd>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-">SnapshotDescription(String, TableName)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-">SnapshotDescription(String, String, SnapshotType)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a></dt>
-<dd>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-">SnapshotDescription(String, TableName, SnapshotType)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">SnapshotDescription(String, String, SnapshotType, String)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a></dt>
-<dd>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">SnapshotDescription(String, TableName, SnapshotType, String)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription [...]
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-">SnapshotDescription(String, String, SnapshotType, String, long, int)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription [...]
-<dd>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-java.util.Map-">SnapshotDescription(String, TableName, SnapshotType, String, long, int, Map&lt;String, Object&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/SnapshotDescription.html" title= [...]
 <dd>
 <div class="block">SnapshotDescription Parameterized Constructor</div>
diff --git a/apidocs/org/apache/hadoop/hbase/client/BufferedMutatorParams.html b/apidocs/org/apache/hadoop/hbase/client/BufferedMutatorParams.html
index 5c3361f..daf0e3f 100644
--- a/apidocs/org/apache/hadoop/hbase/client/BufferedMutatorParams.html
+++ b/apidocs/org/apache/hadoop/hbase/client/BufferedMutatorParams.html
@@ -238,7 +238,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneabl
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html" title="class in org.apache.hadoop.hbase.client">BufferedMutatorParams</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html#opertationTimeout-int-">opertationTimeout</a></span>(int&nbsp;operationTimeout)</code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <code>#operationTimeout()</code></span></div>
+<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html#operationTimeout-int-"><code>operationTimeout(int)</code></a></span></div>
 </div>
 </td>
 </tr>
@@ -368,7 +368,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneabl
 <h4>opertationTimeout</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&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html" title="class in org.apache.hadoop.hbase.client">BufferedMutatorParams</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/BufferedMutatorParams.html#line.82">opertationTimeout</a>(int&nbsp;operationTimeout)</pre>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <code>#operationTimeout()</code></span></div>
+<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html#operationTimeout-int-"><code>operationTimeout(int)</code></a></span></div>
 </li>
 </ul>
 <a name="getOperationTimeout--">
diff --git a/apidocs/org/apache/hadoop/hbase/client/SnapshotDescription.html b/apidocs/org/apache/hadoop/hbase/client/SnapshotDescription.html
index ade9a26..3f817ff 100644
--- a/apidocs/org/apache/hadoop/hbase/client/SnapshotDescription.html
+++ b/apidocs/org/apache/hadoop/hbase/client/SnapshotDescription.html
@@ -18,8 +18,8 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":42,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10};
-var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
 var tableTab = "tableTab";
@@ -134,49 +134,6 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table)</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</td>
-</tr>
-<tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                   <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type)</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</td>
-</tr>
-<tr class="rowColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                   <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner)</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</td>
-</tr>
-<tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                   <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner,
-                   long&nbsp;creationTime,
-                   int&nbsp;version)</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                    <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</code>&nbsp;</td>
 </tr>
@@ -220,7 +177,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </a>
 <h3>Method Summary</h3>
 <table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
-<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t6" class="tableTab"><span><a href="javascript:show(32);">Deprecated Methods</a></span><span class="t [...]
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Method and Description</th>
@@ -238,35 +195,26 @@ 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/client/SnapshotDescription.html#getOwner--">getOwner</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i3" class="rowColor">
-<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTable--">getTable</a></span>()</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableName--"><code>getTableName()</code></a> or
-   <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableNameAsString--"><code>getTableNameAsString()</code></a> instead.</span></div>
-</div>
-</td>
-</tr>
-<tr id="i4" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableNameAsString--">getTableNameAsString</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTtl--">getTtl</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getType--">getType</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getVersion--">getVersion</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
@@ -301,125 +249,46 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.40">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 </li>
 </ul>
-<a name="SnapshotDescription-java.lang.String-java.lang.String-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>SnapshotDescription</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&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.51">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table)</pre>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-"><code>SnapshotDescription(String, TableName)</code></a>, 
-<a href="https://issues.apache.org/jira/browse/HBASE-16892">HBASE-16892</a></dd>
-</dl>
-</li>
-</ul>
 <a name="SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>SnapshotDescription</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.55">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.44">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                            <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table)</pre>
 </li>
 </ul>
-<a name="SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>SnapshotDescription</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&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.66">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                                       <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type)</pre>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-"><code>SnapshotDescription(String, TableName, SnapshotType)</code></a>, 
-<a href="https://issues.apache.org/jira/browse/HBASE-16892">HBASE-16892</a></dd>
-</dl>
-</li>
-</ul>
 <a name="SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>SnapshotDescription</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.70">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.48">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                            <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                            <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type)</pre>
 </li>
 </ul>
-<a name="SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>SnapshotDescription</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&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.81">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                                       <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
-                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner)</pre>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-"><code>SnapshotDescription(String, TableName, SnapshotType, String)</code></a>, 
-<a href="https://issues.apache.org/jira/browse/HBASE-16892">HBASE-16892</a></dd>
-</dl>
-</li>
-</ul>
 <a name="SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>SnapshotDescription</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.85">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.52">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                            <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                            <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner)</pre>
 </li>
 </ul>
-<a name="SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>SnapshotDescription</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&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.96">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                                       <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
-                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner,
-                                       long&nbsp;creationTime,
-                                       int&nbsp;version)</pre>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-java.util.Map-"><code>SnapshotDescription(String, TableName, SnapshotType, String, long, int, Map)</code></a>, 
-<a href="https://issues.apache.org/jira/browse/HBASE-16892">HBASE-16892</a></dd>
-</dl>
-</li>
-</ul>
 <a name="SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-java.util.Map-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>SnapshotDescription</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.112">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.67">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                            <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                            <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner,
@@ -445,7 +314,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Snap
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SnapshotDescription</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.135">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.90">SnapshotDescription</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
                            <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                            <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;snapshotProps)</pre>
@@ -473,25 +342,7 @@ public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Snap
 <ul class="blockList">
 <li class="blockList">
 <h4>getName</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.140">getName</a>()</pre>
-</li>
-</ul>
-<a name="getTable--">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>getTable</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&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.152">getTable</a>()</pre>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableName--"><code>getTableName()</code></a> or
-   <a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableNameAsString--"><code>getTableNameAsString()</code></a> instead.</span></div>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableName--"><code>getTableName()</code></a>, 
-<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#getTableNameAsString--"><code>getTableNameAsString()</code></a>, 
-<a href="https://issues.apache.org/jira/browse/HBASE-16892">HBASE-16892</a></dd>
-</dl>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.95">getName</a>()</pre>
 </li>
 </ul>
 <a name="getTableNameAsString--">
@@ -500,7 +351,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableNameAsString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.156">getTableNameAsString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.99">getTableNameAsString</a>()</pre>
 </li>
 </ul>
 <a name="getTableName--">
@@ -509,7 +360,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.160">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.103">getTableName</a>()</pre>
 </li>
 </ul>
 <a name="getType--">
@@ -518,7 +369,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getType</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.164">getType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.107">getType</a>()</pre>
 </li>
 </ul>
 <a name="getOwner--">
@@ -527,7 +378,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getOwner</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.168">getOwner</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.111">getOwner</a>()</pre>
 </li>
 </ul>
 <a name="getCreationTime--">
@@ -536,7 +387,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getCreationTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.172">getCreationTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.115">getCreationTime</a>()</pre>
 </li>
 </ul>
 <a name="getTtl--">
@@ -545,7 +396,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getTtl</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.177">getTtl</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.120">getTtl</a>()</pre>
 </li>
 </ul>
 <a name="getVersion--">
@@ -554,7 +405,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockList">
 <li class="blockList">
 <h4>getVersion</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.181">getVersion</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.124">getVersion</a>()</pre>
 </li>
 </ul>
 <a name="toString--">
@@ -563,7 +414,7 @@ public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.186">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html#line.129">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
diff --git a/apidocs/org/apache/hadoop/hbase/client/Table.html b/apidocs/org/apache/hadoop/hbase/client/Table.html
index 8c7ea93..f06a313 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Table.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Table.html
@@ -627,6 +627,11 @@ default&nbsp;&lt;R&gt;&nbsp;void&nbsp;<a href="../../../../../src-html/org/apach
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - if a remote or network exception occurs.</dd>
 <dt><span class="simpleTagLabel">Since:</span></dt>
 <dd>0.90.0</dd>
+<dt><span class="simpleTagLabel">API Note:</span></dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/client/Table.html#put-java.util.List-"><code>put(List)</code></a> runs pre-flight validations on the input list on client.
+          Currently <a href="../../../../../org/apache/hadoop/hbase/client/Table.html#get-java.util.List-"><code>get(List)</code></a> doesn't run any validations on the client-side,
+          currently there is no need, but this may change in the future. An
+          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang"><code>IllegalArgumentException</code></a> will be thrown in this case.</dd>
 </dl>
 </li>
 </ul>
@@ -791,6 +796,12 @@ default&nbsp;&lt;R&gt;&nbsp;void&nbsp;<a href="../../../../../src-html/org/apach
  that have not be successfully applied.</dd>
 <dt><span class="simpleTagLabel">Since:</span></dt>
 <dd>0.20.1</dd>
+<dt><span class="simpleTagLabel">API Note:</span></dt>
+<dd>In 3.0.0 version, the input list <code>deletes</code> will no longer be modified. Also,
+          <a href="../../../../../org/apache/hadoop/hbase/client/Table.html#put-java.util.List-"><code>put(List)</code></a> runs pre-flight validations on the input list on client. Currently
+          <a href="../../../../../org/apache/hadoop/hbase/client/Table.html#delete-java.util.List-"><code>delete(List)</code></a> doesn't run validations on the client, there is no need
+          currently, but this may change in the future. An * <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang"><code>IllegalArgumentException</code></a>
+          will be thrown in this case.</dd>
 </dl>
 </li>
 </ul>
diff --git a/apidocs/org/apache/hadoop/hbase/client/class-use/BufferedMutatorParams.html b/apidocs/org/apache/hadoop/hbase/client/class-use/BufferedMutatorParams.html
index 90ae465..a533149 100644
--- a/apidocs/org/apache/hadoop/hbase/client/class-use/BufferedMutatorParams.html
+++ b/apidocs/org/apache/hadoop/hbase/client/class-use/BufferedMutatorParams.html
@@ -139,7 +139,7 @@
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html" title="class in org.apache.hadoop.hbase.client">BufferedMutatorParams</a></code></td>
 <td class="colLast"><span class="typeNameLabel">BufferedMutatorParams.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html#opertationTimeout-int-">opertationTimeout</a></span>(int&nbsp;operationTimeout)</code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <code>#operationTimeout()</code></span></div>
+<div class="block"><span class="deprecationComment">Since 2.3.0, will be removed in 4.0.0. Use <a href="../../../../../../org/apache/hadoop/hbase/client/BufferedMutatorParams.html#operationTimeout-int-"><code>operationTimeout(int)</code></a></span></div>
 </div>
 </td>
 </tr>
diff --git a/apidocs/org/apache/hadoop/hbase/client/class-use/SnapshotType.html b/apidocs/org/apache/hadoop/hbase/client/class-use/SnapshotType.html
index b89b04b..c70658d 100644
--- a/apidocs/org/apache/hadoop/hbase/client/class-use/SnapshotType.html
+++ b/apidocs/org/apache/hadoop/hbase/client/class-use/SnapshotType.html
@@ -164,45 +164,11 @@ the order they are declared.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                   <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type)</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</td>
-</tr>
-<tr class="rowColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                   <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner)</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</td>
-</tr>
-<tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-java.lang.String-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
-                   <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
-                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner,
-                   long&nbsp;creationTime,
-                   int&nbsp;version)</code>
-<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
-<div class="block"><span class="deprecationComment">since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName
-   instance instead.</span></div>
-</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                    <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                    <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.util.Map-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
                    <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                    <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
@@ -210,13 +176,13 @@ the order they are declared.</div>
 <div class="block">SnapshotDescription Parameterized Constructor</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                    <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                    <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;owner)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html#SnapshotDescription-java.lang.String-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.client.SnapshotType-java.lang.String-long-int-java.util.Map-">SnapshotDescription</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                    <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                    <a href="../../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client">SnapshotType</a>&nbsp;type,
diff --git a/apidocs/org/apache/hadoop/hbase/mapred/TableOutputFormat.html b/apidocs/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
index 8a455c0..8ed7469 100644
--- a/apidocs/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
+++ b/apidocs/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
@@ -266,7 +266,7 @@ extends org.apache.hadoop.mapred.FileOutputFormat&lt;<a href="../../../../../org
 <ul class="blockList">
 <li class="blockList">
 <h4>getRecordWriter</h4>
-<pre>public&nbsp;org.apache.hadoop.mapred.RecordWriter&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html#line.121">getRecordWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;ignored,
+<pre>public&nbsp;org.apache.hadoop.mapred.RecordWriter&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html#line.106">getRecordWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;ignored,
                                                              org.apache.hadoop.mapred.JobConf&nbsp;job,
                                                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                                                              org.apache.hadoop.util.Progressable&nbsp;progress)
@@ -300,7 +300,7 @@ extends org.apache.hadoop.mapred.FileOutputFormat&lt;<a href="../../../../../org
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkOutputSpecs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html#line.129">checkOutputSpecs</a>(org.apache.hadoop.fs.FileSystem&nbsp;ignored,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html#line.114">checkOutputSpecs</a>(org.apache.hadoop.fs.FileSystem&nbsp;ignored,
                              org.apache.hadoop.mapred.JobConf&nbsp;job)
                       throws org.apache.hadoop.fs.FileAlreadyExistsException,
                              org.apache.hadoop.mapred.InvalidJobConfException,
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html b/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
index 9895c63..b029a44 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
@@ -124,7 +124,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.108">HFileOutputFormat2</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.107">HFileOutputFormat2</a>
 extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;</pre>
 <div class="block">Writes HFiles. Passed Cells must arrive in order.
  Writes current time as the sequence id for the file. Sets the major compacted
@@ -288,7 +288,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>tableSeparator</h4>
-<pre>protected static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.142">tableSeparator</a></pre>
+<pre>protected static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.128">tableSeparator</a></pre>
 </li>
 </ul>
 <a name="DATABLOCK_ENCODING_OVERRIDE_CONF_KEY">
@@ -297,7 +297,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>DATABLOCK_ENCODING_OVERRIDE_CONF_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.167">DATABLOCK_ENCODING_OVERRIDE_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.153">DATABLOCK_ENCODING_OVERRIDE_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.DATABLOCK_ENCODING_OVERRIDE_CONF_KEY">Constant Field Values</a></dd>
@@ -310,7 +310,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>COMPRESSION_OVERRIDE_CONF_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.169">COMPRESSION_OVERRIDE_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.155">COMPRESSION_OVERRIDE_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.COMPRESSION_OVERRIDE_CONF_KEY">Constant Field Values</a></dd>
@@ -323,7 +323,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>LOCALITY_SENSITIVE_CONF_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.175">LOCALITY_SENSITIVE_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.161">LOCALITY_SENSITIVE_CONF_KEY</a></pre>
 <div class="block">Keep locality while generating HFiles for bulkload. See HBASE-12596</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -337,7 +337,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>STORAGE_POLICY_PROPERTY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.183">STORAGE_POLICY_PROPERTY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.169">STORAGE_POLICY_PROPERTY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.STORAGE_POLICY_PROPERTY">Constant Field Values</a></dd>
@@ -350,7 +350,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>STORAGE_POLICY_PROPERTY_CF_PREFIX</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.184">STORAGE_POLICY_PROPERTY_CF_PREFIX</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.170">STORAGE_POLICY_PROPERTY_CF_PREFIX</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.STORAGE_POLICY_PROPERTY_CF_PREFIX">Constant Field Values</a></dd>
@@ -371,7 +371,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HFileOutputFormat2</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.108">HFileOutputFormat2</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.107">HFileOutputFormat2</a>()</pre>
 </li>
 </ul>
 </li>
@@ -388,7 +388,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>combineTableNameSuffix</h4>
-<pre>protected static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.144">combineTableNameSuffix</a>(byte[]&nbsp;tableName,
+<pre>protected static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.130">combineTableNameSuffix</a>(byte[]&nbsp;tableName,
                                                byte[]&nbsp;suffix)</pre>
 </li>
 </ul>
@@ -398,7 +398,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>getRecordWriter</h4>
-<pre>public&nbsp;org.apache.hadoop.mapreduce.RecordWriter&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.187">getRecordWriter</a>(org.apache.hadoop.mapreduce.TaskAttem [...]
+<pre>public&nbsp;org.apache.hadoop.mapreduce.RecordWriter&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.173">getRecordWriter</a>(org.apache.hadoop.mapreduce.TaskAttem [...]
                                                                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                                                                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -416,7 +416,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableNameSuffixedWithFamily</h4>
-<pre>protected static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.192">getTableNameSuffixedWithFamily</a>(byte[]&nbsp;tableName,
+<pre>protected static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.178">getTableNameSuffixedWithFamily</a>(byte[]&nbsp;tableName,
                                                        byte[]&nbsp;family)</pre>
 </li>
 </ul>
@@ -426,7 +426,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoad</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.595">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.581">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;table,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a>&nbsp;regionLocator)
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -454,7 +454,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockList">
 <li class="blockList">
 <h4>configureIncrementalLoad</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.614">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.600">configureIncrementalLoad</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor,
                                             <a href="../../../../../org/apache/hadoop/hbase/client/RegionLocator.html" title="interface in org.apache.hadoop.hbase.client">RegionLocator</a>&nbsp;regionLocator)
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -482,7 +482,7 @@ extends org.apache.hadoop.mapreduce.lib.output.FileOutputFormat&lt;<a href="../.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>configureIncrementalLoadMap</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.700">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html#line.686">configureIncrementalLoadMap</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                                <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;tableDescriptor)
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
diff --git a/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index a8ca8d8..5c51e34 100644
--- a/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -359,7 +359,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>processOptions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.915">processOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.916">processOptions</a>(org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLine&nbsp;cmd)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code>org.apache.hadoop.hbase.util.AbstractHBaseTool</code></span></div>
 <div class="block">This method is called to process the options after they have been parsed.</div>
 <dl>
@@ -374,7 +374,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doWork</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.940">doWork</a>()
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.941">doWork</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Execute the export snapshot by copying the snapshot metadata, hfiles and wals.</div>
 <dl>
@@ -393,7 +393,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1114">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1115">printUsage</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code>printUsage</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.util.AbstractHBaseTool</code></dd>
@@ -406,7 +406,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>addOptions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1127">addOptions</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1128">addOptions</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code>org.apache.hadoop.hbase.util.AbstractHBaseTool</code></span></div>
 <div class="block">Override this to add command-line options using <code>AbstractHBaseTool.addOptWithArg(java.lang.String, java.lang.String)</code>
  and similar methods.</div>
@@ -422,7 +422,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1142">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1143">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 </li>
 </ul>
 </li>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/BufferedMutatorParams.html b/apidocs/src-html/org/apache/hadoop/hbase/client/BufferedMutatorParams.html
index 15ffd1d..43e1ca2 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/BufferedMutatorParams.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/BufferedMutatorParams.html
@@ -84,7 +84,7 @@
 <span class="sourceLineNo">076</span>  }<a name="line.76"></a>
 <span class="sourceLineNo">077</span><a name="line.77"></a>
 <span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * @deprecated Since 2.3.0, will be removed in 4.0.0. Use {@link #operationTimeout()}<a name="line.79"></a>
+<span class="sourceLineNo">079</span>   * @deprecated Since 2.3.0, will be removed in 4.0.0. Use {@link #operationTimeout(int)}<a name="line.79"></a>
 <span class="sourceLineNo">080</span>   */<a name="line.80"></a>
 <span class="sourceLineNo">081</span>  @Deprecated<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  public BufferedMutatorParams opertationTimeout(final int operationTimeout) {<a name="line.82"></a>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html b/apidocs/src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html
index fa85e2a..395dfc9 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/SnapshotDescription.html
@@ -49,162 +49,105 @@
 <span class="sourceLineNo">041</span>    this(name, (TableName)null);<a name="line.41"></a>
 <span class="sourceLineNo">042</span>  }<a name="line.42"></a>
 <span class="sourceLineNo">043</span><a name="line.43"></a>
-<span class="sourceLineNo">044</span>  /**<a name="line.44"></a>
-<span class="sourceLineNo">045</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName<a name="line.45"></a>
-<span class="sourceLineNo">046</span>   *   instance instead.<a name="line.46"></a>
-<span class="sourceLineNo">047</span>   * @see #SnapshotDescription(String, TableName)<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-16892"&gt;HBASE-16892&lt;/a&gt;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  @Deprecated<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  public SnapshotDescription(String name, String table) {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    this(name, TableName.valueOf(table));<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
-<span class="sourceLineNo">054</span><a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public SnapshotDescription(String name, TableName table) {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    this(name, table, SnapshotType.DISABLED, null, -1, -1, null);<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  }<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  /**<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   *   instance instead.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * @see #SnapshotDescription(String, TableName, SnapshotType)<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-16892"&gt;HBASE-16892&lt;/a&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   */<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  @Deprecated<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public SnapshotDescription(String name, String table, SnapshotType type) {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    this(name, TableName.valueOf(table), type);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  }<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  public SnapshotDescription(String name, TableName table, SnapshotType type) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    this(name, table, type, null, -1, -1, null);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  }<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  /**<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * @see #SnapshotDescription(String, TableName, SnapshotType, String)<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-16892"&gt;HBASE-16892&lt;/a&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   *   instance instead.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   */<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  @Deprecated<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public SnapshotDescription(String name, String table, SnapshotType type, String owner) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    this(name, TableName.valueOf(table), type, owner);<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public SnapshotDescription(String name, TableName table, SnapshotType type, String owner) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    this(name, table, type, owner, -1, -1, null);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  /**<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * @see #SnapshotDescription(String, TableName, SnapshotType, String, long, int, Map)<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-16892"&gt;HBASE-16892&lt;/a&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use the version with the TableName<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   *   instance instead.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @Deprecated<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public SnapshotDescription(String name, String table, SnapshotType type, String owner,<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      long creationTime, int version) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    this(name, TableName.valueOf(table), type, owner, creationTime, version, null);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  }<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  /**<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * SnapshotDescription Parameterized Constructor<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   *<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param name          Name of the snapshot<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * @param table         TableName associated with the snapshot<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * @param type          Type of the snapshot - enum SnapshotType<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * @param owner         Snapshot Owner<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * @param creationTime  Creation time for Snapshot<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * @param version       Snapshot Version<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * @param snapshotProps Additional properties for snapshot e.g. TTL<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public SnapshotDescription(String name, TableName table, SnapshotType type, String owner,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>                             long creationTime, int version, Map&lt;String, Object&gt; snapshotProps) {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    this.name = name;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    this.table = table;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    this.snapShotType = type;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    this.owner = owner;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    this.creationTime = creationTime;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    this.ttl = getTtlFromSnapshotProps(snapshotProps);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    this.version = version;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private long getTtlFromSnapshotProps(Map&lt;String, Object&gt; snapshotProps) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return MapUtils.getLongValue(snapshotProps, "TTL", -1);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  /**<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * SnapshotDescription Parameterized Constructor<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   *<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * @param snapshotName  Name of the snapshot<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * @param tableName     TableName associated with the snapshot<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param type          Type of the snapshot - enum SnapshotType<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param snapshotProps Additional properties for snapshot e.g. TTL<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public SnapshotDescription(String snapshotName, TableName tableName, SnapshotType type,<a name="line.135"></a>
-<span class="sourceLineNo">136</span>                             Map&lt;String, Object&gt; snapshotProps) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    this(snapshotName, tableName, type, null, -1, -1, snapshotProps);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public String getName() {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    return this.name;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  /**<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #getTableName()} or<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   *   {@link #getTableNameAsString()} instead.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   * @see #getTableName()<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @see #getTableNameAsString()<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-16892"&gt;HBASE-16892&lt;/a&gt;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  @Deprecated<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public String getTable() {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return getTableNameAsString();<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  public String getTableNameAsString() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return this.table.getNameAsString();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public TableName getTableName() {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return this.table;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>  public SnapshotType getType() {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    return this.snapShotType;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public String getOwner() {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return this.owner;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public long getCreationTime() {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    return this.creationTime;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  }<a name="line.174"></a>
-<span class="sourceLineNo">175</span><a name="line.175"></a>
-<span class="sourceLineNo">176</span>  // get snapshot ttl in sec<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  public long getTtl() {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    return ttl;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public int getVersion() {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    return this.version;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  @Override<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  public String toString() {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    return new StringBuilder("SnapshotDescription: ")<a name="line.187"></a>
-<span class="sourceLineNo">188</span>            .append("name = ")<a name="line.188"></a>
-<span class="sourceLineNo">189</span>            .append(name)<a name="line.189"></a>
-<span class="sourceLineNo">190</span>            .append("/table = ")<a name="line.190"></a>
-<span class="sourceLineNo">191</span>            .append(table)<a name="line.191"></a>
-<span class="sourceLineNo">192</span>            .append(" /owner = ")<a name="line.192"></a>
-<span class="sourceLineNo">193</span>            .append(owner)<a name="line.193"></a>
-<span class="sourceLineNo">194</span>            .append(creationTime != -1 ? ("/creationtime = " + creationTime) : "")<a name="line.194"></a>
-<span class="sourceLineNo">195</span>            .append(ttl != -1 ? ("/ttl = " + ttl) : "")<a name="line.195"></a>
-<span class="sourceLineNo">196</span>            .append(version != -1 ? ("/version = " + version) : "")<a name="line.196"></a>
-<span class="sourceLineNo">197</span>            .toString();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>}<a name="line.199"></a>
+<span class="sourceLineNo">044</span>  public SnapshotDescription(String name, TableName table) {<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    this(name, table, SnapshotType.DISABLED, null, -1, -1, null);<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  public SnapshotDescription(String name, TableName table, SnapshotType type) {<a name="line.48"></a>
+<span class="sourceLineNo">049</span>    this(name, table, type, null, -1, -1, null);<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  }<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  public SnapshotDescription(String name, TableName table, SnapshotType type, String owner) {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    this(name, table, type, owner, -1, -1, null);<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  }<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>  /**<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * SnapshotDescription Parameterized Constructor<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   *<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   * @param name          Name of the snapshot<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * @param table         TableName associated with the snapshot<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * @param type          Type of the snapshot - enum SnapshotType<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   * @param owner         Snapshot Owner<a name="line.62"></a>
+<span class="sourceLineNo">063</span>   * @param creationTime  Creation time for Snapshot<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * @param version       Snapshot Version<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * @param snapshotProps Additional properties for snapshot e.g. TTL<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  public SnapshotDescription(String name, TableName table, SnapshotType type, String owner,<a name="line.67"></a>
+<span class="sourceLineNo">068</span>                             long creationTime, int version, Map&lt;String, Object&gt; snapshotProps) {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    this.name = name;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    this.table = table;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    this.snapShotType = type;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    this.owner = owner;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    this.creationTime = creationTime;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    this.ttl = getTtlFromSnapshotProps(snapshotProps);<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    this.version = version;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  }<a name="line.76"></a>
+<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private long getTtlFromSnapshotProps(Map&lt;String, Object&gt; snapshotProps) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    return MapUtils.getLongValue(snapshotProps, "TTL", -1);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  /**<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * SnapshotDescription Parameterized Constructor<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   *<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * @param snapshotName  Name of the snapshot<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   * @param tableName     TableName associated with the snapshot<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * @param type          Type of the snapshot - enum SnapshotType<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * @param snapshotProps Additional properties for snapshot e.g. TTL<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public SnapshotDescription(String snapshotName, TableName tableName, SnapshotType type,<a name="line.90"></a>
+<span class="sourceLineNo">091</span>                             Map&lt;String, Object&gt; snapshotProps) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    this(snapshotName, tableName, type, null, -1, -1, snapshotProps);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>  public String getName() {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    return this.name;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public String getTableNameAsString() {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    return this.table.getNameAsString();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  public TableName getTableName() {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    return this.table;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public SnapshotType getType() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    return this.snapShotType;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public String getOwner() {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    return this.owner;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public long getCreationTime() {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return this.creationTime;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  // get snapshot ttl in sec<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public long getTtl() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    return ttl;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  public int getVersion() {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return this.version;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  @Override<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  public String toString() {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    return new StringBuilder("SnapshotDescription: ")<a name="line.130"></a>
+<span class="sourceLineNo">131</span>            .append("name = ")<a name="line.131"></a>
+<span class="sourceLineNo">132</span>            .append(name)<a name="line.132"></a>
+<span class="sourceLineNo">133</span>            .append("/table = ")<a name="line.133"></a>
+<span class="sourceLineNo">134</span>            .append(table)<a name="line.134"></a>
+<span class="sourceLineNo">135</span>            .append(" /owner = ")<a name="line.135"></a>
+<span class="sourceLineNo">136</span>            .append(owner)<a name="line.136"></a>
+<span class="sourceLineNo">137</span>            .append(creationTime != -1 ? ("/creationtime = " + creationTime) : "")<a name="line.137"></a>
+<span class="sourceLineNo">138</span>            .append(ttl != -1 ? ("/ttl = " + ttl) : "")<a name="line.138"></a>
+<span class="sourceLineNo">139</span>            .append(version != -1 ? ("/version = " + version) : "")<a name="line.139"></a>
+<span class="sourceLineNo">140</span>            .toString();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span>}<a name="line.142"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Table.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Table.html
index ea75926..751c9e1 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Table.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Table.html
@@ -184,9 +184,9 @@
 <span class="sourceLineNo">176</span>   * @throws IOException if a remote or network exception occurs.<a name="line.176"></a>
 <span class="sourceLineNo">177</span>   * @since 0.90.0<a name="line.177"></a>
 <span class="sourceLineNo">178</span>   * @apiNote {@link #put(List)} runs pre-flight validations on the input list on client.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   *   Currently {@link #get(List)} doesn't run any validations on the client-side, currently there<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   *   is no need, but this may change in the future. An<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * {@link IllegalArgumentException} will be thrown in this case.<a name="line.181"></a>
+<span class="sourceLineNo">179</span>   *          Currently {@link #get(List)} doesn't run any validations on the client-side,<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   *          currently there is no need, but this may change in the future. An<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *          {@link IllegalArgumentException} will be thrown in this case.<a name="line.181"></a>
 <span class="sourceLineNo">182</span>   */<a name="line.182"></a>
 <span class="sourceLineNo">183</span>  default Result[] get(List&lt;Get&gt; gets) throws IOException {<a name="line.183"></a>
 <span class="sourceLineNo">184</span>    throw new NotImplementedException("Add an implementation!");<a name="line.184"></a>
@@ -292,10 +292,10 @@
 <span class="sourceLineNo">284</span>   * that have not be successfully applied.<a name="line.284"></a>
 <span class="sourceLineNo">285</span>   * @since 0.20.1<a name="line.285"></a>
 <span class="sourceLineNo">286</span>   * @apiNote In 3.0.0 version, the input list {@code deletes} will no longer be modified. Also,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * {@link #put(List)} runs pre-flight validations on the input list on client. Currently<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * {@link #delete(List)} doesn't run validations on the client, there is no need currently,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * but this may change in the future. An * {@link IllegalArgumentException} will be thrown<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * in this case.<a name="line.290"></a>
+<span class="sourceLineNo">287</span>   *          {@link #put(List)} runs pre-flight validations on the input list on client. Currently<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   *          {@link #delete(List)} doesn't run validations on the client, there is no need<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   *          currently, but this may change in the future. An * {@link IllegalArgumentException}<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   *          will be thrown in this case.<a name="line.290"></a>
 <span class="sourceLineNo">291</span>   */<a name="line.291"></a>
 <span class="sourceLineNo">292</span>  default void delete(List&lt;Delete&gt; deletes) throws IOException {<a name="line.292"></a>
 <span class="sourceLineNo">293</span>    throw new NotImplementedException("Add an implementation!");<a name="line.293"></a>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html b/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
index e00d3ea..2e6b2e3 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
@@ -61,87 +61,72 @@
 <span class="sourceLineNo">053</span>    private BufferedMutator m_mutator;<a name="line.53"></a>
 <span class="sourceLineNo">054</span>    private Connection conn;<a name="line.54"></a>
 <span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>    /**<a name="line.57"></a>
-<span class="sourceLineNo">058</span>     * Instantiate a TableRecordWriter with the HBase HClient for writing.<a name="line.58"></a>
-<span class="sourceLineNo">059</span>     *<a name="line.59"></a>
-<span class="sourceLineNo">060</span>     * @deprecated since 2.0.0 and will be removed in 3.0.0. Please use<a name="line.60"></a>
-<span class="sourceLineNo">061</span>     *   {@code #TableRecordWriter(JobConf)} instead. This version does not clean up connections and<a name="line.61"></a>
-<span class="sourceLineNo">062</span>     *   will leak connections (removed in 2.0).<a name="line.62"></a>
-<span class="sourceLineNo">063</span>     * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-16774"&gt;HBASE-16774&lt;/a&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>     */<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    @Deprecated<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    public TableRecordWriter(final BufferedMutator mutator) throws IOException {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      this.m_mutator = mutator;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      this.conn = null;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>     * Instantiate a TableRecordWriter with a BufferedMutator for batch writing.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>     */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    public TableRecordWriter(JobConf job) throws IOException {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // expecting exactly one path<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      TableName tableName = TableName.valueOf(job.get(OUTPUT_TABLE));<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      try {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        this.conn = ConnectionFactory.createConnection(job);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        this.m_mutator = conn.getBufferedMutator(tableName);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      } finally {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        if (this.m_mutator == null) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>          conn.close();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>          conn = null;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>        }<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      }<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>    public void close(Reporter reporter) throws IOException {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      try {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        if (this.m_mutator != null) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          this.m_mutator.close();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      } finally {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        if (conn != null) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>          this.conn.close();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      }<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void write(ImmutableBytesWritable key, Put value) throws IOException {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      m_mutator.mutate(new Put(value));<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  }<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * Creates a new record writer.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * Be aware that the baseline javadoc gives the impression that there is a single<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * {@link RecordWriter} per job but in HBase, it is more natural if we give you a new<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * RecordWriter per call of this method. You must close the returned RecordWriter when done.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * Failure to do so will drop writes.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   *<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * @param ignored Ignored filesystem<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * @param job Current JobConf<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param name Name of the job<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * @param progress<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * @return The newly created writer instance.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * @throws IOException When creating the writer fails.<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  @Override<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  public RecordWriter getRecordWriter(FileSystem ignored, JobConf job, String name,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      Progressable progress)<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  throws IOException {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    // Clear write buffer on fail is true by default so no need to reset it.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    return new TableRecordWriter(job);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  @Override<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void checkOutputSpecs(FileSystem ignored, JobConf job)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  throws FileAlreadyExistsException, InvalidJobConfException, IOException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    String tableName = job.get(OUTPUT_TABLE);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    if (tableName == null) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      throw new IOException("Must specify table name");<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span>}<a name="line.136"></a>
+<span class="sourceLineNo">056</span>    /**<a name="line.56"></a>
+<span class="sourceLineNo">057</span>     * Instantiate a TableRecordWriter with a BufferedMutator for batch writing.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>     */<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    public TableRecordWriter(JobConf job) throws IOException {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      // expecting exactly one path<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      TableName tableName = TableName.valueOf(job.get(OUTPUT_TABLE));<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      try {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>        this.conn = ConnectionFactory.createConnection(job);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>        this.m_mutator = conn.getBufferedMutator(tableName);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      } finally {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>        if (this.m_mutator == null) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>          conn.close();<a name="line.67"></a>
+<span class="sourceLineNo">068</span>          conn = null;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>        }<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      }<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    }<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public void close(Reporter reporter) throws IOException {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>      try {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>        if (this.m_mutator != null) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>          this.m_mutator.close();<a name="line.76"></a>
+<span class="sourceLineNo">077</span>        }<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      } finally {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        if (conn != null) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>          this.conn.close();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        }<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>    public void write(ImmutableBytesWritable key, Put value) throws IOException {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      m_mutator.mutate(new Put(value));<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    }<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * Creates a new record writer.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   *<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * Be aware that the baseline javadoc gives the impression that there is a single<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * {@link RecordWriter} per job but in HBase, it is more natural if we give you a new<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * RecordWriter per call of this method. You must close the returned RecordWriter when done.<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * Failure to do so will drop writes.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   *<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * @param ignored Ignored filesystem<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * @param job Current JobConf<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * @param name Name of the job<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param progress<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @return The newly created writer instance.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * @throws IOException When creating the writer fails.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @Override<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  public RecordWriter getRecordWriter(FileSystem ignored, JobConf job, String name,<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      Progressable progress)<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  throws IOException {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // Clear write buffer on fail is true by default so no need to reset it.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    return new TableRecordWriter(job);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @Override<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public void checkOutputSpecs(FileSystem ignored, JobConf job)<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  throws FileAlreadyExistsException, InvalidJobConfException, IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    String tableName = job.get(OUTPUT_TABLE);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    if (tableName == null) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      throw new IOException("Must specify table name");<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    }<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>}<a name="line.121"></a>
 
 
 
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 7870314..3a09c42 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.html
@@ -56,910 +56,896 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.HConstants;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.PrivateCellUtil;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.TableName;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Put;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Table;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.fs.HFileSystem;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.io.ImmutableBytesWritable;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.compress.Compression.Algorithm;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.io.hfile.HFileWriterImpl;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.StoreFileWriter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.BloomFilterUtil;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.util.MapReduceExtendedCell;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.io.NullWritable;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.io.SequenceFile;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.io.Text;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.mapreduce.Job;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.mapreduce.OutputCommitter;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.mapreduce.OutputFormat;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.mapreduce.RecordWriter;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.mapreduce.TaskAttemptContext;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.slf4j.Logger;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.slf4j.LoggerFactory;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>/**<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * Writes HFiles. Passed Cells must arrive in order.<a name="line.99"></a>
-<span class="sourceLineNo">100</span> * Writes current time as the sequence id for the file. Sets the major compacted<a name="line.100"></a>
-<span class="sourceLineNo">101</span> * attribute on created @{link {@link HFile}s. Calling write(null,null) will forcibly roll<a name="line.101"></a>
-<span class="sourceLineNo">102</span> * all HFiles being written.<a name="line.102"></a>
-<span class="sourceLineNo">103</span> * &lt;p&gt;<a name="line.103"></a>
-<span class="sourceLineNo">104</span> * Using this class as part of a MapReduce job is best done<a name="line.104"></a>
-<span class="sourceLineNo">105</span> * using {@link #configureIncrementalLoad(Job, TableDescriptor, RegionLocator)}.<a name="line.105"></a>
-<span class="sourceLineNo">106</span> */<a name="line.106"></a>
-<span class="sourceLineNo">107</span>@InterfaceAudience.Public<a name="line.107"></a>
-<span class="sourceLineNo">108</span>public class HFileOutputFormat2<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    extends FileOutputFormat&lt;ImmutableBytesWritable, Cell&gt; {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private static final Logger LOG = LoggerFactory.getLogger(HFileOutputFormat2.class);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  static class TableInfo {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    private TableDescriptor tableDesctiptor;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    private RegionLocator regionLocator;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    public TableInfo(TableDescriptor tableDesctiptor, RegionLocator regionLocator) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      this.tableDesctiptor = tableDesctiptor;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      this.regionLocator = regionLocator;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    /**<a name="line.120"></a>
-<span class="sourceLineNo">121</span>     * The modification for the returned HTD doesn't affect the inner TD.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>     * @return A clone of inner table descriptor<a name="line.122"></a>
-<span class="sourceLineNo">123</span>     * @deprecated since 2.0.0 and will be removed in 3.0.0. Use {@link #getTableDescriptor()}<a name="line.123"></a>
-<span class="sourceLineNo">124</span>     *   instead.<a name="line.124"></a>
-<span class="sourceLineNo">125</span>     * @see #getTableDescriptor()<a name="line.125"></a>
-<span class="sourceLineNo">126</span>     * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-18241"&gt;HBASE-18241&lt;/a&gt;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>     */<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    @Deprecated<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public HTableDescriptor getHTableDescriptor() {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      return new HTableDescriptor(tableDesctiptor);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    public TableDescriptor getTableDescriptor() {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      return tableDesctiptor;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>    public RegionLocator getRegionLocator() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      return regionLocator;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  protected static final byte[] tableSeparator = Bytes.toBytes(";");<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  protected static byte[] combineTableNameSuffix(byte[] tableName, byte[] suffix) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    return Bytes.add(tableName, tableSeparator, suffix);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // The following constants are private since these are used by<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // HFileOutputFormat2 to internally transfer data between job setup and<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  // reducer run using conf.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  // These should not be changed by the client.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  static final String COMPRESSION_FAMILIES_CONF_KEY =<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      "hbase.hfileoutputformat.families.compression";<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  static final String BLOOM_TYPE_FAMILIES_CONF_KEY =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      "hbase.hfileoutputformat.families.bloomtype";<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  static final String BLOOM_PARAM_FAMILIES_CONF_KEY =<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      "hbase.hfileoutputformat.families.bloomparam";<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  static final String BLOCK_SIZE_FAMILIES_CONF_KEY =<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      "hbase.mapreduce.hfileoutputformat.blocksize";<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static final String DATABLOCK_ENCODING_FAMILIES_CONF_KEY =<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      "hbase.mapreduce.hfileoutputformat.families.datablock.encoding";<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  // This constant is public since the client can modify this when setting<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  // up their conf object and thus refer to this symbol.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  // It is present for backwards compatibility reasons. Use it only to<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  // override the auto-detection of datablock encoding and compression.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  public static final String DATABLOCK_ENCODING_OVERRIDE_CONF_KEY =<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      "hbase.mapreduce.hfileoutputformat.datablock.encoding";<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public static final String COMPRESSION_OVERRIDE_CONF_KEY =<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      "hbase.mapreduce.hfileoutputformat.compression";<a name="line.170"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.PrivateCellUtil;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.TableName;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Put;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Table;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.fs.HFileSystem;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.io.ImmutableBytesWritable;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.compress.Compression.Algorithm;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.io.hfile.HFileWriterImpl;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.regionserver.StoreFileWriter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.util.BloomFilterUtil;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.util.MapReduceExtendedCell;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.io.NullWritable;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.io.SequenceFile;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.io.Text;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.mapreduce.Job;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.mapreduce.OutputCommitter;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.mapreduce.OutputFormat;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.mapreduce.RecordWriter;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.mapreduce.TaskAttemptContext;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.mapreduce.lib.partition.TotalOrderPartitioner;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.slf4j.Logger;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.slf4j.LoggerFactory;<a name="line.93"></a>
+<span class="sourceLineNo">094</span><a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>/**<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * Writes HFiles. Passed Cells must arrive in order.<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * Writes current time as the sequence id for the file. Sets the major compacted<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * attribute on created @{link {@link HFile}s. Calling write(null,null) will forcibly roll<a name="line.100"></a>
+<span class="sourceLineNo">101</span> * all HFiles being written.<a name="line.101"></a>
+<span class="sourceLineNo">102</span> * &lt;p&gt;<a name="line.102"></a>
+<span class="sourceLineNo">103</span> * Using this class as part of a MapReduce job is best done<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * using {@link #configureIncrementalLoad(Job, TableDescriptor, RegionLocator)}.<a name="line.104"></a>
+<span class="sourceLineNo">105</span> */<a name="line.105"></a>
+<span class="sourceLineNo">106</span>@InterfaceAudience.Public<a name="line.106"></a>
+<span class="sourceLineNo">107</span>public class HFileOutputFormat2<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    extends FileOutputFormat&lt;ImmutableBytesWritable, Cell&gt; {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private static final Logger LOG = LoggerFactory.getLogger(HFileOutputFormat2.class);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  static class TableInfo {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    private TableDescriptor tableDesctiptor;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    private RegionLocator regionLocator;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>    public TableInfo(TableDescriptor tableDesctiptor, RegionLocator regionLocator) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      this.tableDesctiptor = tableDesctiptor;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      this.regionLocator = regionLocator;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    public TableDescriptor getTableDescriptor() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      return tableDesctiptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public RegionLocator getRegionLocator() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      return regionLocator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  protected static final byte[] tableSeparator = Bytes.toBytes(";");<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  protected static byte[] combineTableNameSuffix(byte[] tableName, byte[] suffix) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    return Bytes.add(tableName, tableSeparator, suffix);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>  // The following constants are private since these are used by<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // HFileOutputFormat2 to internally transfer data between job setup and<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  // reducer run using conf.<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  // These should not be changed by the client.<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  static final String COMPRESSION_FAMILIES_CONF_KEY =<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      "hbase.hfileoutputformat.families.compression";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  static final String BLOOM_TYPE_FAMILIES_CONF_KEY =<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      "hbase.hfileoutputformat.families.bloomtype";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  static final String BLOOM_PARAM_FAMILIES_CONF_KEY =<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      "hbase.hfileoutputformat.families.bloomparam";<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  static final String BLOCK_SIZE_FAMILIES_CONF_KEY =<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      "hbase.mapreduce.hfileoutputformat.blocksize";<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  static final String DATABLOCK_ENCODING_FAMILIES_CONF_KEY =<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      "hbase.mapreduce.hfileoutputformat.families.datablock.encoding";<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // This constant is public since the client can modify this when setting<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // up their conf object and thus refer to this symbol.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  // It is present for backwards compatibility reasons. Use it only to<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // override the auto-detection of datablock encoding and compression.<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  public static final String DATABLOCK_ENCODING_OVERRIDE_CONF_KEY =<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      "hbase.mapreduce.hfileoutputformat.datablock.encoding";<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public static final String COMPRESSION_OVERRIDE_CONF_KEY =<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      "hbase.mapreduce.hfileoutputformat.compression";<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  /**<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * Keep locality while generating HFiles for bulkload. See HBASE-12596<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public static final String LOCALITY_SENSITIVE_CONF_KEY =<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      "hbase.bulkload.locality.sensitive.enabled";<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  private static final boolean DEFAULT_LOCALITY_SENSITIVE = true;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  static final String OUTPUT_TABLE_NAME_CONF_KEY =<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      "hbase.mapreduce.hfileoutputformat.table.name";<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  static final String MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY =<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          "hbase.mapreduce.use.multi.table.hfileoutputformat";<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public static final String STORAGE_POLICY_PROPERTY = HStore.BLOCK_STORAGE_POLICY_KEY;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public static final String STORAGE_POLICY_PROPERTY_CF_PREFIX = STORAGE_POLICY_PROPERTY + ".";<a name="line.170"></a>
 <span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * Keep locality while generating HFiles for bulkload. See HBASE-12596<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  public static final String LOCALITY_SENSITIVE_CONF_KEY =<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "hbase.bulkload.locality.sensitive.enabled";<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private static final boolean DEFAULT_LOCALITY_SENSITIVE = true;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  static final String OUTPUT_TABLE_NAME_CONF_KEY =<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "hbase.mapreduce.hfileoutputformat.table.name";<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  static final String MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY =<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          "hbase.mapreduce.use.multi.table.hfileoutputformat";<a name="line.181"></a>
-<span class="sourceLineNo">182</span><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  public static final String STORAGE_POLICY_PROPERTY = HStore.BLOCK_STORAGE_POLICY_KEY;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  public static final String STORAGE_POLICY_PROPERTY_CF_PREFIX = STORAGE_POLICY_PROPERTY + ".";<a name="line.184"></a>
+<span class="sourceLineNo">172</span>  @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public RecordWriter&lt;ImmutableBytesWritable, Cell&gt; getRecordWriter(<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      final TaskAttemptContext context) throws IOException, InterruptedException {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    return createRecordWriter(context, this.getOutputCommitter(context));<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  protected static byte[] getTableNameSuffixedWithFamily(byte[] tableName, byte[] family) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    return combineTableNameSuffix(tableName, family);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>  static &lt;V extends Cell&gt; RecordWriter&lt;ImmutableBytesWritable, V&gt;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      createRecordWriter(final TaskAttemptContext context, final OutputCommitter committer)<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          throws IOException {<a name="line.184"></a>
 <span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Override<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public RecordWriter&lt;ImmutableBytesWritable, Cell&gt; getRecordWriter(<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      final TaskAttemptContext context) throws IOException, InterruptedException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    return createRecordWriter(context, this.getOutputCommitter(context));<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  }<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  protected static byte[] getTableNameSuffixedWithFamily(byte[] tableName, byte[] family) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    return combineTableNameSuffix(tableName, family);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  }<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  static &lt;V extends Cell&gt; RecordWriter&lt;ImmutableBytesWritable, V&gt;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      createRecordWriter(final TaskAttemptContext context, final OutputCommitter committer)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>          throws IOException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Get the path of the temporary output file<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    final Path outputDir = ((FileOutputCommitter)committer).getWorkPath();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    final Configuration conf = context.getConfiguration();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    final boolean writeMultipleTables = conf.getBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, false) ;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    final String writeTableNames = conf.get(OUTPUT_TABLE_NAME_CONF_KEY);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    if (writeTableNames==null || writeTableNames.isEmpty()) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      throw new IllegalArgumentException("Configuration parameter " + OUTPUT_TABLE_NAME_CONF_KEY<a name="line.206"></a>
-<span class="sourceLineNo">207</span>              + " cannot be empty");<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    final FileSystem fs = outputDir.getFileSystem(conf);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    // These configs. are from hbase-*.xml<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    final long maxsize = conf.getLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        HConstants.DEFAULT_MAX_FILE_SIZE);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // Invented config.  Add to hbase-*.xml if other than default compression.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    final String defaultCompressionStr = conf.get("hfile.compression",<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        Compression.Algorithm.NONE.getName());<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    final Algorithm defaultCompression = HFileWriterImpl<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        .compressionByName(defaultCompressionStr);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    String compressionStr = conf.get(COMPRESSION_OVERRIDE_CONF_KEY);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    final Algorithm overriddenCompression;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (compressionStr != null) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      overriddenCompression = Compression.getCompressionAlgorithmByName(compressionStr);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    } else {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      overriddenCompression = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    final boolean compactionExclude = conf.getBoolean(<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        "hbase.mapreduce.hfileoutputformat.compaction.exclude", false);<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>    final Set&lt;String&gt; allTableNames = Arrays.stream(writeTableNames.split(<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            Bytes.toString(tableSeparator))).collect(Collectors.toSet());<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // create a map from column family to the compression algorithm<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    final Map&lt;byte[], Algorithm&gt; compressionMap = createFamilyCompressionMap(conf);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    final Map&lt;byte[], BloomType&gt; bloomTypeMap = createFamilyBloomTypeMap(conf);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    final Map&lt;byte[], String&gt; bloomParamMap = createFamilyBloomParamMap(conf);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    final Map&lt;byte[], Integer&gt; blockSizeMap = createFamilyBlockSizeMap(conf);<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>    String dataBlockEncodingStr = conf.get(DATABLOCK_ENCODING_OVERRIDE_CONF_KEY);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    final Map&lt;byte[], DataBlockEncoding&gt; datablockEncodingMap<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        = createFamilyDataBlockEncodingMap(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    final DataBlockEncoding overriddenEncoding;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    if (dataBlockEncodingStr != null) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      overriddenEncoding = DataBlockEncoding.valueOf(dataBlockEncodingStr);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } else {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      overriddenEncoding = null;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new RecordWriter&lt;ImmutableBytesWritable, V&gt;() {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      // Map of families to writers and how much has been output on the writer.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      private final Map&lt;byte[], WriterLength&gt; writers =<a name="line.250"></a>
-<span class="sourceLineNo">251</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      private byte[] previousRow = HConstants.EMPTY_BYTE_ARRAY;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      private boolean rollRequested = false;<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>      @Override<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      public void write(ImmutableBytesWritable row, V cell)<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          throws IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        Cell kv = cell;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        // null input == user explicitly wants to flush<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        if (row == null &amp;&amp; kv == null) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          rollWriters(null);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          return;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>        byte[] rowKey = CellUtil.cloneRow(kv);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        int length = (PrivateCellUtil.estimatedSerializedSizeOf(kv)) - Bytes.SIZEOF_INT;<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        byte[] family = CellUtil.cloneFamily(kv);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        byte[] tableNameBytes = null;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        if (writeMultipleTables) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>          tableNameBytes = MultiTableHFileOutputFormat.getTableName(row.get());<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          tableNameBytes =<a name="line.272"></a>
-<span class="sourceLineNo">273</span>              TableName.valueOf(tableNameBytes).getNameWithNamespaceInclAsString()<a name="line.273"></a>
-<span class="sourceLineNo">274</span>              .getBytes(Charset.defaultCharset());<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          if (!allTableNames.contains(Bytes.toString(tableNameBytes))) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>            throw new IllegalArgumentException("TableName '" + Bytes.toString(tableNameBytes) +<a name="line.276"></a>
-<span class="sourceLineNo">277</span>                    "' not" + " expected");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        } else {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          tableNameBytes = Bytes.toBytes(writeTableNames);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        Path tableRelPath = getTableRelativePath(tableNameBytes);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableNameBytes, family);<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>        WriterLength wl = this.writers.get(tableAndFamily);<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>        // If this is a new column family, verify that the directory exists<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (wl == null) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          Path writerPath = null;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>          if (writeMultipleTables) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            writerPath = new Path(outputDir,new Path(tableRelPath, Bytes<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                    .toString(family)));<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          else {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>            writerPath = new Path(outputDir, Bytes.toString(family));<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          fs.mkdirs(writerPath);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          configureStoragePolicy(conf, fs, tableAndFamily, writerPath);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
+<span class="sourceLineNo">186</span>    // Get the path of the temporary output file<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    final Path outputDir = ((FileOutputCommitter)committer).getWorkPath();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    final Configuration conf = context.getConfiguration();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    final boolean writeMultipleTables = conf.getBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, false) ;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    final String writeTableNames = conf.get(OUTPUT_TABLE_NAME_CONF_KEY);<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    if (writeTableNames==null || writeTableNames.isEmpty()) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      throw new IllegalArgumentException("Configuration parameter " + OUTPUT_TABLE_NAME_CONF_KEY<a name="line.192"></a>
+<span class="sourceLineNo">193</span>              + " cannot be empty");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final FileSystem fs = outputDir.getFileSystem(conf);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // These configs. are from hbase-*.xml<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    final long maxsize = conf.getLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        HConstants.DEFAULT_MAX_FILE_SIZE);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    // Invented config.  Add to hbase-*.xml if other than default compression.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    final String defaultCompressionStr = conf.get("hfile.compression",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        Compression.Algorithm.NONE.getName());<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    final Algorithm defaultCompression = HFileWriterImpl<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        .compressionByName(defaultCompressionStr);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    String compressionStr = conf.get(COMPRESSION_OVERRIDE_CONF_KEY);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    final Algorithm overriddenCompression;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    if (compressionStr != null) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      overriddenCompression = Compression.getCompressionAlgorithmByName(compressionStr);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } else {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      overriddenCompression = null;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>    final boolean compactionExclude = conf.getBoolean(<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        "hbase.mapreduce.hfileoutputformat.compaction.exclude", false);<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>    final Set&lt;String&gt; allTableNames = Arrays.stream(writeTableNames.split(<a name="line.215"></a>
+<span class="sourceLineNo">216</span>            Bytes.toString(tableSeparator))).collect(Collectors.toSet());<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>    // create a map from column family to the compression algorithm<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    final Map&lt;byte[], Algorithm&gt; compressionMap = createFamilyCompressionMap(conf);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    final Map&lt;byte[], BloomType&gt; bloomTypeMap = createFamilyBloomTypeMap(conf);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    final Map&lt;byte[], String&gt; bloomParamMap = createFamilyBloomParamMap(conf);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    final Map&lt;byte[], Integer&gt; blockSizeMap = createFamilyBlockSizeMap(conf);<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    String dataBlockEncodingStr = conf.get(DATABLOCK_ENCODING_OVERRIDE_CONF_KEY);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    final Map&lt;byte[], DataBlockEncoding&gt; datablockEncodingMap<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        = createFamilyDataBlockEncodingMap(conf);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    final DataBlockEncoding overriddenEncoding;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    if (dataBlockEncodingStr != null) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      overriddenEncoding = DataBlockEncoding.valueOf(dataBlockEncodingStr);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    } else {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      overriddenEncoding = null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>    return new RecordWriter&lt;ImmutableBytesWritable, V&gt;() {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      // Map of families to writers and how much has been output on the writer.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      private final Map&lt;byte[], WriterLength&gt; writers =<a name="line.236"></a>
+<span class="sourceLineNo">237</span>              new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      private byte[] previousRow = HConstants.EMPTY_BYTE_ARRAY;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      private final long now = EnvironmentEdgeManager.currentTime();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      private boolean rollRequested = false;<a name="line.240"></a>
+<span class="sourceLineNo">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>
+<span class="sourceLineNo">244</span>          throws IOException {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        Cell kv = cell;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        // null input == user explicitly wants to flush<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        if (row == null &amp;&amp; kv == null) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          rollWriters(null);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          return;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>        byte[] rowKey = CellUtil.cloneRow(kv);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        int length = (PrivateCellUtil.estimatedSerializedSizeOf(kv)) - Bytes.SIZEOF_INT;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        byte[] family = CellUtil.cloneFamily(kv);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        byte[] tableNameBytes = null;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        if (writeMultipleTables) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          tableNameBytes = MultiTableHFileOutputFormat.getTableName(row.get());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          tableNameBytes =<a name="line.258"></a>
+<span class="sourceLineNo">259</span>              TableName.valueOf(tableNameBytes).getNameWithNamespaceInclAsString()<a name="line.259"></a>
+<span class="sourceLineNo">260</span>              .getBytes(Charset.defaultCharset());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          if (!allTableNames.contains(Bytes.toString(tableNameBytes))) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>            throw new IllegalArgumentException("TableName '" + Bytes.toString(tableNameBytes) +<a name="line.262"></a>
+<span class="sourceLineNo">263</span>                    "' not" + " expected");<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        } else {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>          tableNameBytes = Bytes.toBytes(writeTableNames);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        Path tableRelPath = getTableRelativePath(tableNameBytes);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableNameBytes, family);<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>        WriterLength wl = this.writers.get(tableAndFamily);<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>        // If this is a new column family, verify that the directory exists<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        if (wl == null) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          Path writerPath = null;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          if (writeMultipleTables) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>            writerPath = new Path(outputDir,new Path(tableRelPath, Bytes<a name="line.278"></a>
+<span class="sourceLineNo">279</span>                    .toString(family)));<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>          }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          else {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            writerPath = new Path(outputDir, Bytes.toString(family));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>          }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          fs.mkdirs(writerPath);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          configureStoragePolicy(conf, fs, tableAndFamily, writerPath);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>          this.rollRequested = true;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>        // This can only happen once a row is finished though<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        if (rollRequested &amp;&amp; Bytes.compareTo(this.previousRow, rowKey) != 0) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          rollWriters(wl);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>        // create a new WAL writer, if necessary<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        if (wl == null || wl.writer == null) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>            HRegionLocation loc = null;<a name="line.301"></a>
 <span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>        if (wl != null &amp;&amp; wl.written + length &gt;= maxsize) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>          this.rollRequested = true;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        }<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>        // This can only happen once a row is finished though<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        if (rollRequested &amp;&amp; Bytes.compareTo(this.previousRow, rowKey) != 0) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          rollWriters(wl);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>        // create a new WAL writer, if necessary<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        if (wl == null || wl.writer == null) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>          if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>            HRegionLocation loc = null;<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>            if (tableName != null) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>                     RegionLocator locator =<a name="line.319"></a>
-<span class="sourceLineNo">320</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>                loc = locator.getRegionLocation(rowKey);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>              } catch (Throwable e) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.323"></a>
-<span class="sourceLineNo">324</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                loc = null;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>              } }<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>            if (null == loc) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>              if (LOG.isTraceEnabled()) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.330"></a>
-<span class="sourceLineNo">331</span>                  Bytes.toString(rowKey));<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, null);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>            } else {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>              if (LOG.isDebugEnabled()) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              }<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              InetSocketAddress initialIsa =<a name="line.338"></a>
-<span class="sourceLineNo">339</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              if (initialIsa.isUnresolved()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>                if (LOG.isTraceEnabled()) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.342"></a>
-<span class="sourceLineNo">343</span>                      + loc.getPort() + ", so use default writer");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>                }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              } else {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                if (LOG.isDebugEnabled()) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.348"></a>
-<span class="sourceLineNo">349</span>                }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<a name="line.350"></a>
-<span class="sourceLineNo">351</span>                });<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>          } else {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>        // we now have the proper WAL writer. full steam ahead<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        wl.writer.append(kv);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        wl.written += length;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>        // Copy the row so we know when a row transition.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        this.previousRow = rowKey;<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>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        String[] tableNameParts = tableName.split(":");<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        if (tableNameParts.length &gt; 1) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        return tableRelPath;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        if (writerLength != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>          closeWriter(writerLength);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        } else {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (WriterLength wl : this.writers.values()) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            closeWriter(wl);<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>        this.rollRequested = false;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
-<span class="sourceLineNo">387</span><a name="line.387"></a>
-<span class="sourceLineNo">388</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        if (wl.writer != null) {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          LOG.info(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          close(wl.writer);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        wl.writer = null;<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        wl.written = 0;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>      /*<a name="line.398"></a>
-<span class="sourceLineNo">399</span>       * Create a new StoreFile.Writer.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>       * @param family<a name="line.400"></a>
-<span class="sourceLineNo">401</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>       * @throws IOException<a name="line.402"></a>
-<span class="sourceLineNo">403</span>       */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          justification="Not important")<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.406"></a>
-<span class="sourceLineNo">407</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        if (writeMultipleTables) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          familydir = new Path(outputDir,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        WriterLength wl = new WriterLength();<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        Algorithm compression = overriddenCompression;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        compression = compression == null ? defaultCompression : compression;<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.422"></a>
+<span class="sourceLineNo">303</span>            if (tableName != null) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>              try (Connection connection = ConnectionFactory.createConnection(conf);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>                     RegionLocator locator =<a name="line.305"></a>
+<span class="sourceLineNo">306</span>                       connection.getRegionLocator(TableName.valueOf(tableName))) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>                loc = locator.getRegionLocation(rowKey);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>              } catch (Throwable e) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>                LOG.warn("There's something wrong when locating rowkey: " +<a name="line.309"></a>
+<span class="sourceLineNo">310</span>                  Bytes.toString(rowKey) + " for tablename: " + tableName, e);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>                loc = null;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>              } }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>            if (null == loc) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>              if (LOG.isTraceEnabled()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>                LOG.trace("failed to get region location, so use default writer for rowkey: " +<a name="line.316"></a>
+<span class="sourceLineNo">317</span>                  Bytes.toString(rowKey));<a name="line.317"></a>
+<span class="sourceLineNo">318</span>              }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>              wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>            } else {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>              if (LOG.isDebugEnabled()) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>                LOG.debug("first rowkey: [" + Bytes.toString(rowKey) + "]");<a name="line.322"></a>
+<span class="sourceLineNo">323</span>              }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>              InetSocketAddress initialIsa =<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                  new InetSocketAddress(loc.getHostname(), loc.getPort());<a name="line.325"></a>
+<span class="sourceLineNo">326</span>              if (initialIsa.isUnresolved()) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>                if (LOG.isTraceEnabled()) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                  LOG.trace("failed to resolve bind address: " + loc.getHostname() + ":"<a name="line.328"></a>
+<span class="sourceLineNo">329</span>                      + loc.getPort() + ", so use default writer");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>                }<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>              } else {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>                if (LOG.isDebugEnabled()) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>                  LOG.debug("use favored nodes writer: " + initialIsa.getHostString());<a name="line.334"></a>
+<span class="sourceLineNo">335</span>                }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>                wl = getNewWriter(tableNameBytes, family, conf, new InetSocketAddress[] { initialIsa<a name="line.336"></a>
+<span class="sourceLineNo">337</span>                });<a name="line.337"></a>
+<span class="sourceLineNo">338</span>              }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          } else {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            wl = getNewWriter(tableNameBytes, family, conf, null);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>        // we now have the proper WAL writer. full steam ahead<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        PrivateCellUtil.updateLatestStamp(cell, this.now);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        wl.writer.append(kv);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        wl.written += length;<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>        // Copy the row so we know when a row transition.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        this.previousRow = rowKey;<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>      private Path getTableRelativePath(byte[] tableNameBytes) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        String tableName = Bytes.toString(tableNameBytes);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        String[] tableNameParts = tableName.split(":");<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        Path tableRelPath = new Path(tableName.split(":")[0]);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        if (tableNameParts.length &gt; 1) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          tableRelPath = new Path(tableRelPath, tableName.split(":")[1]);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        return tableRelPath;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      private void rollWriters(WriterLength writerLength) throws IOException {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        if (writerLength != null) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          closeWriter(writerLength);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        } else {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>          for (WriterLength wl : this.writers.values()) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>            closeWriter(wl);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        this.rollRequested = false;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>      private void closeWriter(WriterLength wl) throws IOException {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        if (wl.writer != null) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          LOG.info(<a name="line.376"></a>
+<span class="sourceLineNo">377</span>              "Writer=" + wl.writer.getPath() + ((wl.written == 0)? "": ", wrote=" + wl.written));<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          close(wl.writer);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        }<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        wl.writer = null;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        wl.written = 0;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>      /*<a name="line.384"></a>
+<span class="sourceLineNo">385</span>       * Create a new StoreFile.Writer.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>       * @param family<a name="line.386"></a>
+<span class="sourceLineNo">387</span>       * @return A WriterLength, containing a new StoreFile.Writer.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>       * @throws IOException<a name="line.388"></a>
+<span class="sourceLineNo">389</span>       */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BX_UNBOXING_IMMEDIATELY_REBOXED",<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          justification="Not important")<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      private WriterLength getNewWriter(byte[] tableName, byte[] family, Configuration<a name="line.392"></a>
+<span class="sourceLineNo">393</span>              conf, InetSocketAddress[] favoredNodes) throws IOException {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        byte[] tableAndFamily = getTableNameSuffixedWithFamily(tableName, family);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        Path familydir = new Path(outputDir, Bytes.toString(family));<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        if (writeMultipleTables) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          familydir = new Path(outputDir,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>                  new Path(getTableRelativePath(tableName), Bytes.toString(family)));<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        }<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        WriterLength wl = new WriterLength();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        Algorithm compression = overriddenCompression;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        compression = compression == null ? compressionMap.get(tableAndFamily) : compression;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        compression = compression == null ? defaultCompression : compression;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        BloomType bloomType = bloomTypeMap.get(tableAndFamily);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        bloomType = bloomType == null ? BloomType.NONE : bloomType;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        String bloomParam = bloomParamMap.get(tableAndFamily);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          conf.set(BloomFilterUtil.PREFIX_LENGTH_KEY, bloomParam);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.415"></a>
+<span class="sourceLineNo">416</span>                                    .withCompression(compression)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.417"></a>
+<span class="sourceLineNo">418</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.418"></a>
+<span class="sourceLineNo">419</span>                                    .withBlockSize(blockSize);<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>          contextBuilder.withIncludesTags(true);<a name="line.422"></a>
 <span class="sourceLineNo">423</span>        }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        Integer blockSize = blockSizeMap.get(tableAndFamily);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        blockSize = blockSize == null ? HConstants.DEFAULT_BLOCKSIZE : blockSize;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        DataBlockEncoding encoding = overriddenEncoding;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        encoding = encoding == null ? datablockEncodingMap.get(tableAndFamily) : encoding;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        encoding = encoding == null ? DataBlockEncoding.NONE : encoding;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        HFileContextBuilder contextBuilder = new HFileContextBuilder()<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                                    .withCompression(compression)<a name="line.430"></a>
-<span class="sourceLineNo">431</span>                                    .withChecksumType(HStore.getChecksumType(conf))<a name="line.431"></a>
-<span class="sourceLineNo">432</span>                                    .withBytesPerCheckSum(HStore.getBytesPerChecksum(conf))<a name="line.432"></a>
-<span class="sourceLineNo">433</span>                                    .withBlockSize(blockSize);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>        if (HFile.getFormatVersion(conf) &gt;= HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          contextBuilder.withIncludesTags(true);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>        contextBuilder.withDataBlockEncoding(encoding);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        HFileContext hFileContext = contextBuilder.build();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        if (null == favoredNodes) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>          wl.writer =<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, fs)<a name="line.443"></a>
-<span class="sourceLineNo">444</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext).build();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>        } else {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          wl.writer =<a name="line.447"></a>
-<span class="sourceLineNo">448</span>              new StoreFileWriter.Builder(conf, CacheConfig.DISABLED, new HFileSystem(fs))<a name="line.448"></a>
-<span class="sourceLineNo">449</span>                  .withOutputDir(familydir).withBloomType(bloomType)<a name="line.449"></a>
-<span class="sourceLineNo">450</span>                  .withComparator(CellComparator.getInstance()).withFileContext(hFileContext)<a name="line.450"></a>
-<span class="sourceLineNo">451</span>                  .withFavoredNodes(favoredNodes).build();<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>        this.writers.put(tableAndFamily, wl);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        return wl;<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>      private void close(final StoreFileWriter w) throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        if (w != null) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          w.appendFileInfo(BULKLOAD_TIME_KEY,<a name="line.460"></a>
-<span class="sourceLineNo">461</span>              Bytes.toBytes(System.currentTimeMillis()));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          w.appendFileInfo(BULKLOAD_TASK_KEY,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>              Bytes.toBytes(context.getTaskAttemptID().toString()));<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          w.appendFileInfo(MAJOR_COMPACTION_KEY,<a name="line.464"></a>
-<span class="sourceLineNo">465</span>              Bytes.toBytes(true));<a name="line.465"></a>
-<span class="sourceLineNo">466</span>          w.appendFileInfo(EXCLUDE_FROM_MINOR_COMPACTION_KEY,<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              Bytes.toBytes(compactionExclude));<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          w.appendTrackedTimestampsToMetadata();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          w.close();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>      @Override<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      public void close(TaskAttemptContext c)<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      throws IOException, InterruptedException {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        for (WriterLength wl: this.writers.values()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          close(wl.writer);<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>  }<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>   * Configure block storage policy for CF after the directory is created.<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  static void configureStoragePolicy(final Configuration conf, final FileSystem fs,<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] tableAndFamily, Path cfPath) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    if (null == conf || null == fs || null == tableAndFamily || null == cfPath) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      return;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></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">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>    String policy =<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(tableAndFamily),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          conf.get(STORAGE_POLICY_PROPERTY));<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    FSUtils.setStoragePolicy(fs, cfPath, policy);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>  /*<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * Data structure to hold a Writer and amount of data written on it.<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static class WriterLength {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    long written = 0;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    StoreFileWriter writer = null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  /**<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   * Return the start keys of all of the regions in this table,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * as a list of ImmutableBytesWritable.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   */<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                                                                 boolean writeMultipleTables)<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          throws IOException {<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      TableName tableName = regionLocator.getName();<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      for (byte[] byteKey : byteKeys) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.521"></a>
-<span class="sourceLineNo">522</span>        if (writeMultipleTables)<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          //MultiTableHFileOutputFormat use case<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>        }<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        if (LOG.isDebugEnabled()) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.528"></a>
-<span class="sourceLineNo">529</span>                  (fullKey) + "]");<a name="line.529"></a>
-<span class="sourceLineNo">530</span>        }<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      }<a name="line.532"></a>
+<span class="sourceLineNo">492</span>  /**<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * Return the start keys of all of the regions in this table,<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   * as a list of ImmutableBytesWritable.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  private static List&lt;ImmutableBytesWritable&gt; getRegionStartKeys(List&lt;RegionLocator&gt; regionLocators,<a name="line.496"></a>
+<span class="sourceLineNo">497</span>                                                                 boolean writeMultipleTables)<a name="line.497"></a>
+<span class="sourceLineNo">498</span>          throws IOException {<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>    ArrayList&lt;ImmutableBytesWritable&gt; ret = new ArrayList&lt;&gt;();<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    for(RegionLocator regionLocator : regionLocators)<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      TableName tableName = regionLocator.getName();<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      LOG.info("Looking up current regions for table " + tableName);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      byte[][] byteKeys = regionLocator.getStartKeys();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      for (byte[] byteKey : byteKeys) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>        byte[] fullKey = byteKey; //HFileOutputFormat2 use case<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        if (writeMultipleTables)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          //MultiTableHFileOutputFormat use case<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          fullKey = combineTableNameSuffix(tableName.getName(), byteKey);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        if (LOG.isDebugEnabled()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          LOG.debug("SplitPoint startkey for table [" + tableName + "]: [" + Bytes.toStringBinary<a name="line.514"></a>
+<span class="sourceLineNo">515</span>                  (fullKey) + "]");<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        }<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        ret.add(new ImmutableBytesWritable(fullKey));<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      }<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    return ret;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
+<span class="sourceLineNo">522</span><a name="line.522"></a>
+<span class="sourceLineNo">523</span>  /**<a name="line.523"></a>
+<span class="sourceLineNo">524</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.524"></a>
+<span class="sourceLineNo">525</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   */<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @SuppressWarnings("deprecation")<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    if (startKeys.isEmpty()) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      throw new IllegalArgumentException("No regions passed");<a name="line.532"></a>
 <span class="sourceLineNo">533</span>    }<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return ret;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>  /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * Write out a {@link SequenceFile} that can be read by<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * {@link TotalOrderPartitioner} that contains the split points in startKeys.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   */<a name="line.540"></a>
-<span class="sourceLineNo">541</span>  @SuppressWarnings("deprecation")<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  private static void writePartitions(Configuration conf, Path partitionsPath,<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      List&lt;ImmutableBytesWritable&gt; startKeys, boolean writeMultipleTables) throws IOException {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    LOG.info("Writing partition information to " + partitionsPath);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    if (startKeys.isEmpty()) {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      throw new IllegalArgumentException("No regions passed");<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // We're generating a list of split points, and we don't ever<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    // empty reducer with index 0<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    ImmutableBytesWritable first = sorted.first();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    if (writeMultipleTables) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.556"></a>
-<span class="sourceLineNo">557</span>              ().get()));<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      throw new IllegalArgumentException(<a name="line.560"></a>
-<span class="sourceLineNo">561</span>          "First region of table should have empty start key. Instead has: "<a name="line.561"></a>
-<span class="sourceLineNo">562</span>          + Bytes.toStringBinary(first.get()));<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    sorted.remove(sorted.first());<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    // Write the actual file<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      NullWritable.class);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        writer.append(startKey, NullWritable.get());<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      }<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    } finally {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      writer.close();<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  }<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>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * table. This<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * &lt;ul&gt;<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.585"></a>
-<span class="sourceLineNo">586</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   * &lt;/ul&gt;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * running this function.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      throws IOException {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>  }<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>  /**<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   * table. This<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   * &lt;ul&gt;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * &lt;/ul&gt;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * running this function.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      RegionLocator regionLocator) throws IOException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  }<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    Configuration conf = job.getConfiguration();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    job.setOutputFormatClass(cls);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    boolean writeMultipleTables = false;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      writeMultipleTables = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // sort the incoming values.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      job.setReducerClass(CellSortReducer.class);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      job.setReducerClass(PutSortReducer.class);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      job.setReducerClass(TextSortReducer.class);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    } else {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.651"></a>
-<span class="sourceLineNo">652</span>        CellSerialization.class.getName());<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    /* Now get the region start keys for every table required */<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      String tn = writeMultipleTables?<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      allTableNames.add(tn);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    }<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.673"></a>
-<span class="sourceLineNo">674</span>            .toString(tableSeparator)));<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    // Use table's region boundaries for TOP split points.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        "to match current region count for all tables");<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    job.setNumReduceTasks(startKeys.size());<a name="line.679"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    // We're generating a list of split points, and we don't ever<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    // have keys &lt; the first region (which has an empty start key)<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    // so we need to remove it. Otherwise we would end up with an<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    // empty reducer with index 0<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    TreeSet&lt;ImmutableBytesWritable&gt; sorted = new TreeSet&lt;&gt;(startKeys);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    ImmutableBytesWritable first = sorted.first();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    if (writeMultipleTables) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      first = new ImmutableBytesWritable(MultiTableHFileOutputFormat.getSuffix(sorted.first<a name="line.542"></a>
+<span class="sourceLineNo">543</span>              ().get()));<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    if (!first.equals(HConstants.EMPTY_BYTE_ARRAY)) {<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      throw new IllegalArgumentException(<a name="line.546"></a>
+<span class="sourceLineNo">547</span>          "First region of table should have empty start key. Instead has: "<a name="line.547"></a>
+<span class="sourceLineNo">548</span>          + Bytes.toStringBinary(first.get()));<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    }<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    sorted.remove(sorted.first());<a name="line.550"></a>
+<span class="sourceLineNo">551</span><a name="line.551"></a>
+<span class="sourceLineNo">552</span>    // Write the actual file<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    FileSystem fs = partitionsPath.getFileSystem(conf);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    SequenceFile.Writer writer = SequenceFile.createWriter(<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      fs, conf, partitionsPath, ImmutableBytesWritable.class,<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      NullWritable.class);<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    try {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>      for (ImmutableBytesWritable startKey : sorted) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        writer.append(startKey, NullWritable.get());<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      }<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      writer.close();<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
+<span class="sourceLineNo">566</span><a name="line.566"></a>
+<span class="sourceLineNo">567</span>  /**<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.568"></a>
+<span class="sourceLineNo">569</span>   * table. This<a name="line.569"></a>
+<span class="sourceLineNo">570</span>   * &lt;ul&gt;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * &lt;/ul&gt;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * running this function.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   */<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  public static void configureIncrementalLoad(Job job, Table table, RegionLocator regionLocator)<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      throws IOException {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    configureIncrementalLoad(job, table.getDescriptor(), regionLocator);<a name="line.583"></a>
+<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
+<span class="sourceLineNo">585</span><a name="line.585"></a>
+<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * Configure a MapReduce Job to perform an incremental load into the given<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   * table. This<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   * &lt;ul&gt;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   *   &lt;li&gt;Inspects the table to configure a total order partitioner&lt;/li&gt;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   *   &lt;li&gt;Uploads the partitions file to the cluster and adds it to the DistributedCache&lt;/li&gt;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>   *   &lt;li&gt;Sets the number of reduce tasks to match the current number of regions&lt;/li&gt;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>   *   &lt;li&gt;Sets the output key/value class to match HFileOutputFormat2's requirements&lt;/li&gt;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>   *   &lt;li&gt;Sets the reducer up to perform the appropriate sorting (either KeyValueSortReducer or<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   *     PutSortReducer)&lt;/li&gt;<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   * &lt;/ul&gt;<a name="line.596"></a>
+<span class="sourceLineNo">597</span>   * The user should be sure to set the map output value class to either KeyValue or Put before<a name="line.597"></a>
+<span class="sourceLineNo">598</span>   * running this function.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>   */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  public static void configureIncrementalLoad(Job job, TableDescriptor tableDescriptor,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      RegionLocator regionLocator) throws IOException {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    ArrayList&lt;TableInfo&gt; singleTableInfo = new ArrayList&lt;&gt;();<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    singleTableInfo.add(new TableInfo(tableDescriptor, regionLocator));<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    configureIncrementalLoad(job, singleTableInfo, HFileOutputFormat2.class);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  static void configureIncrementalLoad(Job job, List&lt;TableInfo&gt; multiTableInfo,<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      Class&lt;? extends OutputFormat&lt;?, ?&gt;&gt; cls) throws IOException {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    Configuration conf = job.getConfiguration();<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    job.setOutputFormatClass(cls);<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>    if (multiTableInfo.stream().distinct().count() != multiTableInfo.size()) {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      throw new IllegalArgumentException("Duplicate entries found in TableInfo argument");<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    boolean writeMultipleTables = false;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    if (MultiTableHFileOutputFormat.class.equals(cls)) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      writeMultipleTables = true;<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      conf.setBoolean(MULTI_TABLE_HFILEOUTPUTFORMAT_CONF_KEY, true);<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    }<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    // Based on the configured map output class, set the correct reducer to properly<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    // sort the incoming values.<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    // TODO it would be nice to pick one or the other of these formats.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    if (KeyValue.class.equals(job.getMapOutputValueClass())<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        || MapReduceExtendedCell.class.equals(job.getMapOutputValueClass())) {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      job.setReducerClass(CellSortReducer.class);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    } else if (Put.class.equals(job.getMapOutputValueClass())) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      job.setReducerClass(PutSortReducer.class);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    } else if (Text.class.equals(job.getMapOutputValueClass())) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      job.setReducerClass(TextSortReducer.class);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    } else {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      LOG.warn("Unknown map output value type:" + job.getMapOutputValueClass());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
+<span class="sourceLineNo">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">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (conf.getBoolean(LOCALITY_SENSITIVE_CONF_KEY, DEFAULT_LOCALITY_SENSITIVE)) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      LOG.info("bulkload locality sensitive enabled");<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    /* Now get the region start keys for every table required */<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    List&lt;String&gt; allTableNames = new ArrayList&lt;&gt;(multiTableInfo.size());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    List&lt;RegionLocator&gt; regionLocators = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    List&lt;TableDescriptor&gt; tableDescriptors = new ArrayList&lt;&gt;( multiTableInfo.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    for( TableInfo tableInfo : multiTableInfo )<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      regionLocators.add(tableInfo.getRegionLocator());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      String tn = writeMultipleTables?<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        tableInfo.getRegionLocator().getName().getNameWithNamespaceInclAsString():<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        tableInfo.getRegionLocator().getName().getNameAsString();<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      allTableNames.add(tn);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      tableDescriptors.add(tableInfo.getTableDescriptor());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    // Record tablenames for creating writer by favored nodes, and decoding compression, block size and other attributes of columnfamily per table<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, StringUtils.join(allTableNames, Bytes<a name="line.659"></a>
+<span class="sourceLineNo">660</span>            .toString(tableSeparator)));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    List&lt;ImmutableBytesWritable&gt; startKeys = getRegionStartKeys(regionLocators, writeMultipleTables);<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    // Use table's region boundaries for TOP split points.<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    LOG.info("Configuring " + startKeys.size() + " reduce partitions " +<a name="line.663"></a>
+<span class="sourceLineNo">664</span>        "to match current region count for all tables");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    job.setNumReduceTasks(startKeys.size());<a name="line.665"></a>
+<span class="sourceLineNo">666</span><a name="line.666"></a>
+<span class="sourceLineNo">667</span>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    // Set compression algorithms based on column families<a name="line.668"></a>
+<span class="sourceLineNo">669</span><a name="line.669"></a>
+<span class="sourceLineNo">670</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.670"></a>
+<span class="sourceLineNo">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>    configurePartitioner(job, startKeys, writeMultipleTables);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Set compression algorithms based on column families<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(compressionDetails,<a name="line.684"></a>
-<span class="sourceLineNo">685</span>            tableDescriptors));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(blockSizeDetails,<a name="line.686"></a>
-<span class="sourceLineNo">687</span>            tableDescriptors));<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomTypeDetails,<a name="line.688"></a>
-<span class="sourceLineNo">689</span>            tableDescriptors));<a name="line.689"></a>
-<span class="sourceLineNo">690</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY, serializeColumnFamilyAttribute(bloomParamDetails,<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        tableDescriptors));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>            serializeColumnFamilyAttribute(dataBlockEncodingDetails, tableDescriptors));<a name="line.693"></a>
-<span class="sourceLineNo">694</span><a name="line.694"></a>
-<span class="sourceLineNo">695</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    TableMapReduceUtil.initCredentials(job);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    LOG.info("Incremental output configured for tables: " + StringUtils.join(allTableNames, ","));<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  public static void configureIncrementalLoadMap(Job job, TableDescriptor tableDescriptor) throws<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      IOException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    Configuration conf = job.getConfiguration();<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    // Set compression algorithms based on column families<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.713"></a>
-<span class="sourceLineNo">714</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.717"></a>
-<span class="sourceLineNo">718</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    TableMapReduceUtil.initCredentials(job);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.726"></a>
-<span class="sourceLineNo">727</span>  }<a name="line.727"></a>
-<span class="sourceLineNo">728</span><a name="line.728"></a>
-<span class="sourceLineNo">729</span>  /**<a name="line.729"></a>
-<span class="sourceLineNo">730</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.730"></a>
-<span class="sourceLineNo">731</span>   * map from the configuration.<a name="line.731"></a>
-<span class="sourceLineNo">732</span>   *<a name="line.732"></a>
-<span class="sourceLineNo">733</span>   * @param conf to read the serialized values from<a name="line.733"></a>
-<span class="sourceLineNo">734</span>   * @return a map from column family to the configured compression algorithm<a name="line.734"></a>
-<span class="sourceLineNo">735</span>   */<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  @VisibleForTesting<a name="line.736"></a>
-<span class="sourceLineNo">737</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      conf) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    return compressionMap;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  }<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>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   * map from the configuration.<a name="line.751"></a>
-<span class="sourceLineNo">752</span>   *<a name="line.752"></a>
-<span class="sourceLineNo">753</span>   * @param conf to read the serialized values from<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * @return a map from column family to the the configured bloom filter type<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   */<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  @VisibleForTesting<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    return bloomTypeMap;<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>  /**<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   * map from the configuration.<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   *<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @param conf to read the serialized values from<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   * @return a map from column family to the the configured bloom filter param<a name="line.773"></a>
-<span class="sourceLineNo">774</span>   */<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  @VisibleForTesting<a name="line.775"></a>
-<span class="sourceLineNo">776</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
-<span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>  /**<a name="line.781"></a>
-<span class="sourceLineNo">782</span>   * Runs inside the task to deserialize column family to block size<a name="line.782"></a>
-<span class="sourceLineNo">783</span>   * map from the configuration.<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   *<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   * @param conf to read the serialized values from<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   * @return a map from column family to the configured block size<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   */<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  @VisibleForTesting<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.790"></a>
-<span class="sourceLineNo">791</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.794"></a>
-<span class="sourceLineNo">795</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    }<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    return blockSizeMap;<a name="line.797"></a>
-<span class="sourceLineNo">798</span>  }<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>  /**<a name="line.800"></a>
-<span class="sourceLineNo">801</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.801"></a>
-<span class="sourceLineNo">802</span>   * type map from the configuration.<a name="line.802"></a>
-<span class="sourceLineNo">803</span>   *<a name="line.803"></a>
-<span class="sourceLineNo">804</span>   * @param conf to read the serialized values from<a name="line.804"></a>
-<span class="sourceLineNo">805</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   *         configured data block type for the family<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   */<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  @VisibleForTesting<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      Configuration conf) {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.811"></a>
-<span class="sourceLineNo">812</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    }<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return encoderMap;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span><a name="line.820"></a>
-<span class="sourceLineNo">821</span>  /**<a name="line.821"></a>
-<span class="sourceLineNo">822</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.822"></a>
-<span class="sourceLineNo">823</span>   *<a name="line.823"></a>
-<span class="sourceLineNo">824</span>   * @param conf to read the serialized values from<a name="line.824"></a>
-<span class="sourceLineNo">825</span>   * @param confName conf key to read from the configuration<a name="line.825"></a>
-<span class="sourceLineNo">826</span>   * @return a map of column family to the given configuration value<a name="line.826"></a>
-<span class="sourceLineNo">827</span>   */<a name="line.827"></a>
-<span class="sourceLineNo">828</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      Configuration conf, String confName) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    String confVal = conf.get(confName, "");<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      String[] familySplit = familyConf.split("=");<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      if (familySplit.length != 2) {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        continue;<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      try {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.838"></a>
-<span class="sourceLineNo">839</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      } catch (UnsupportedEncodingException e) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        // will not happen with UTF-8 encoding<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        throw new AssertionError(e);<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    }<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    return confValMap;<a name="line.845"></a>
-<span class="sourceLineNo">846</span>  }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>  /**<a name="line.848"></a>
-<span class="sourceLineNo">849</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.849"></a>
-<span class="sourceLineNo">850</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.850"></a>
-<span class="sourceLineNo">851</span>   */<a name="line.851"></a>
-<span class="sourceLineNo">852</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          writeMultipleTables)<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      throws IOException {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    Configuration conf = job.getConfiguration();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    // create the partitions file<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    FileSystem fs = FileSystem.get(conf);<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    String hbaseTmpFsDir =<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    fs.makeQualified(partitionsPath);<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    fs.deleteOnExit(partitionsPath);<a name="line.864"></a>
-<span class="sourceLineNo">865</span><a name="line.865"></a>
-<span class="sourceLineNo">866</span>    // configure job to use it<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.871"></a>
-<span class="sourceLineNo">872</span>  @VisibleForTesting<a name="line.872"></a>
-<span class="sourceLineNo">873</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      throws UnsupportedEncodingException {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    int i = 0;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      if (tableDescriptor == null) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        // could happen with mock table instance<a name="line.879"></a>
-<span class="sourceLineNo">880</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.880"></a>
-<span class="sourceLineNo">881</span>        return "";<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        if (i++ &gt; 0) {<a name="line.884"></a>
-<span class="sourceLineNo">885</span>          attributeValue.append('&amp;');<a name="line.885"></a>
-<span class="sourceLineNo">886</span>        }<a name="line.886"></a>
-<span class="sourceLineNo">887</span>        attributeValue.append(URLEncoder.encode(<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.888"></a>
-<span class="sourceLineNo">889</span>            "UTF-8"));<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        attributeValue.append('=');<a name="line.890"></a>
-<span class="sourceLineNo">891</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<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>    // Get rid of the last ampersand<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    return attributeValue.toString();<a name="line.895"></a>
-<span class="sourceLineNo">896</span>  }<a name="line.896"></a>
-<span class="sourceLineNo">897</span><a name="line.897"></a>
-<span class="sourceLineNo">898</span>  /**<a name="line.898"></a>
-<span class="sourceLineNo">899</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>   * Invoked while configuring the MR job for incremental load.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>  @VisibleForTesting<a name="line.902"></a>
-<span class="sourceLineNo">903</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>          familyDescriptor.getCompressionType().getName();<a name="line.904"></a>
-<span class="sourceLineNo">905</span><a name="line.905"></a>
-<span class="sourceLineNo">906</span>  /**<a name="line.906"></a>
-<span class="sourceLineNo">907</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.907"></a>
-<span class="sourceLineNo">908</span>   * configuring the MR job for incremental load.<a name="line.908"></a>
-<span class="sourceLineNo">909</span>   */<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  @VisibleForTesting<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.911"></a>
-<span class="sourceLineNo">912</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>  /**<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   * configuring the MR job for incremental load.<a name="line.916"></a>
-<span class="sourceLineNo">917</span>   */<a name="line.917"></a>
-<span class="sourceLineNo">918</span>  @VisibleForTesting<a name="line.918"></a>
-<span class="sourceLineNo">919</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    if (bloomType == null) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.922"></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">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">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    job.setOutputValueClass(MapReduceExtendedCell.class);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    job.setOutputFormatClass(HFileOutputFormat2.class);<a name="line.692"></a>
+<span class="sourceLineNo">693</span><a name="line.693"></a>
+<span class="sourceLineNo">694</span>    ArrayList&lt;TableDescriptor&gt; singleTableDescriptor = new ArrayList&lt;&gt;(1);<a name="line.694"></a>
+<span class="sourceLineNo">695</span>    singleTableDescriptor.add(tableDescriptor);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>    conf.set(OUTPUT_TABLE_NAME_CONF_KEY, tableDescriptor.getTableName().getNameAsString());<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    // Set compression algorithms based on column families<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    conf.set(COMPRESSION_FAMILIES_CONF_KEY,<a name="line.699"></a>
+<span class="sourceLineNo">700</span>        serializeColumnFamilyAttribute(compressionDetails, singleTableDescriptor));<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    conf.set(BLOCK_SIZE_FAMILIES_CONF_KEY,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        serializeColumnFamilyAttribute(blockSizeDetails, singleTableDescriptor));<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    conf.set(BLOOM_TYPE_FAMILIES_CONF_KEY,<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        serializeColumnFamilyAttribute(bloomTypeDetails, singleTableDescriptor));<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    conf.set(BLOOM_PARAM_FAMILIES_CONF_KEY,<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        serializeColumnFamilyAttribute(bloomParamDetails, singleTableDescriptor));<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    conf.set(DATABLOCK_ENCODING_FAMILIES_CONF_KEY,<a name="line.707"></a>
+<span class="sourceLineNo">708</span>        serializeColumnFamilyAttribute(dataBlockEncodingDetails, singleTableDescriptor));<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    TableMapReduceUtil.initCredentials(job);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    LOG.info("Incremental table " + tableDescriptor.getTableName() + " output configured.");<a name="line.712"></a>
+<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>  /**<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * Runs inside the task to deserialize column family to compression algorithm<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * map from the configuration.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   *<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   * @param conf to read the serialized values from<a name="line.719"></a>
+<span class="sourceLineNo">720</span>   * @return a map from column family to the configured compression algorithm<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   */<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  @VisibleForTesting<a name="line.722"></a>
+<span class="sourceLineNo">723</span>  static Map&lt;byte[], Algorithm&gt; createFamilyCompressionMap(Configuration<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      conf) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        COMPRESSION_FAMILIES_CONF_KEY);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    Map&lt;byte[], Algorithm&gt; compressionMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      Algorithm algorithm = HFileWriterImpl.compressionByName(e.getValue());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      compressionMap.put(e.getKey(), algorithm);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    return compressionMap;<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>  /**<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * Runs inside the task to deserialize column family to bloom filter type<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   * map from the configuration.<a name="line.737"></a>
+<span class="sourceLineNo">738</span>   *<a name="line.738"></a>
+<span class="sourceLineNo">739</span>   * @param conf to read the serialized values from<a name="line.739"></a>
+<span class="sourceLineNo">740</span>   * @return a map from column family to the the configured bloom filter type<a name="line.740"></a>
+<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  @VisibleForTesting<a name="line.742"></a>
+<span class="sourceLineNo">743</span>  static Map&lt;byte[], BloomType&gt; createFamilyBloomTypeMap(Configuration conf) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.744"></a>
+<span class="sourceLineNo">745</span>        BLOOM_TYPE_FAMILIES_CONF_KEY);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    Map&lt;byte[], BloomType&gt; bloomTypeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      BloomType bloomType = BloomType.valueOf(e.getValue());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      bloomTypeMap.put(e.getKey(), bloomType);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    return bloomTypeMap;<a name="line.751"></a>
+<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
+<span class="sourceLineNo">753</span><a name="line.753"></a>
+<span class="sourceLineNo">754</span>  /**<a name="line.754"></a>
+<span class="sourceLineNo">755</span>   * Runs inside the task to deserialize column family to bloom filter param<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   * map from the configuration.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   *<a name="line.757"></a>
+<span class="sourceLineNo">758</span>   * @param conf to read the serialized values from<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   * @return a map from column family to the the configured bloom filter param<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   */<a name="line.760"></a>
+<span class="sourceLineNo">761</span>  @VisibleForTesting<a name="line.761"></a>
+<span class="sourceLineNo">762</span>  static Map&lt;byte[], String&gt; createFamilyBloomParamMap(Configuration conf) {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    return createFamilyConfValueMap(conf, BLOOM_PARAM_FAMILIES_CONF_KEY);<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span><a name="line.766"></a>
+<span class="sourceLineNo">767</span>  /**<a name="line.767"></a>
+<span class="sourceLineNo">768</span>   * Runs inside the task to deserialize column family to block size<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   * map from the configuration.<a name="line.769"></a>
+<span class="sourceLineNo">770</span>   *<a name="line.770"></a>
+<span class="sourceLineNo">771</span>   * @param conf to read the serialized values from<a name="line.771"></a>
+<span class="sourceLineNo">772</span>   * @return a map from column family to the configured block size<a name="line.772"></a>
+<span class="sourceLineNo">773</span>   */<a name="line.773"></a>
+<span class="sourceLineNo">774</span>  @VisibleForTesting<a name="line.774"></a>
+<span class="sourceLineNo">775</span>  static Map&lt;byte[], Integer&gt; createFamilyBlockSizeMap(Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        BLOCK_SIZE_FAMILIES_CONF_KEY);<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    Map&lt;byte[], Integer&gt; blockSizeMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.779"></a>
+<span class="sourceLineNo">780</span>      Integer blockSize = Integer.parseInt(e.getValue());<a name="line.780"></a>
+<span class="sourceLineNo">781</span>      blockSizeMap.put(e.getKey(), blockSize);<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    }<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    return blockSizeMap;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * Runs inside the task to deserialize column family to data block encoding<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   * type map from the configuration.<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   *<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   * @param conf to read the serialized values from<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   * @return a map from column family to HFileDataBlockEncoder for the<a name="line.791"></a>
+<span class="sourceLineNo">792</span>   *         configured data block type for the family<a name="line.792"></a>
+<span class="sourceLineNo">793</span>   */<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  @VisibleForTesting<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  static Map&lt;byte[], DataBlockEncoding&gt; createFamilyDataBlockEncodingMap(<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      Configuration conf) {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    Map&lt;byte[], String&gt; stringMap = createFamilyConfValueMap(conf,<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        DATABLOCK_ENCODING_FAMILIES_CONF_KEY);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Map&lt;byte[], DataBlockEncoding&gt; encoderMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (Map.Entry&lt;byte[], String&gt; e : stringMap.entrySet()) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      encoderMap.put(e.getKey(), DataBlockEncoding.valueOf((e.getValue())));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    }<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return encoderMap;<a name="line.803"></a>
+<span class="sourceLineNo">804</span>  }<a name="line.804"></a>
+<span class="sourceLineNo">805</span><a name="line.805"></a>
+<span class="sourceLineNo">806</span><a name="line.806"></a>
+<span class="sourceLineNo">807</span>  /**<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   * Run inside the task to deserialize column family to given conf value map.<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   *<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   * @param conf to read the serialized values from<a name="line.810"></a>
+<span class="sourceLineNo">811</span>   * @param confName conf key to read from the configuration<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * @return a map of column family to the given configuration value<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   */<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  private static Map&lt;byte[], String&gt; createFamilyConfValueMap(<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      Configuration conf, String confName) {<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    Map&lt;byte[], String&gt; confValMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    String confVal = conf.get(confName, "");<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    for (String familyConf : confVal.split("&amp;")) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      String[] familySplit = familyConf.split("=");<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      if (familySplit.length != 2) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>        continue;<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      }<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      try {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        confValMap.put(Bytes.toBytes(URLDecoder.decode(familySplit[0], "UTF-8")),<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            URLDecoder.decode(familySplit[1], "UTF-8"));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      } catch (UnsupportedEncodingException e) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        // will not happen with UTF-8 encoding<a name="line.827"></a>
+<span class="sourceLineNo">828</span>        throw new AssertionError(e);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return confValMap;<a name="line.831"></a>
+<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   * Configure &lt;code&gt;job&lt;/code&gt; with a TotalOrderPartitioner, partitioning against<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   * &lt;code&gt;splitPoints&lt;/code&gt;. Cleans up the partitions file after job exists.<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   */<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  static void configurePartitioner(Job job, List&lt;ImmutableBytesWritable&gt; splitPoints, boolean<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          writeMultipleTables)<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      throws IOException {<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    Configuration conf = job.getConfiguration();<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    // create the partitions file<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    FileSystem fs = FileSystem.get(conf);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    String hbaseTmpFsDir =<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        conf.get(HConstants.TEMPORARY_FS_DIRECTORY_KEY,<a name="line.845"></a>
+<span class="sourceLineNo">846</span>            fs.getHomeDirectory() + "/hbase-staging");<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    Path partitionsPath = new Path(hbaseTmpFsDir, "partitions_" + UUID.randomUUID());<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    fs.makeQualified(partitionsPath);<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    writePartitions(conf, partitionsPath, splitPoints, writeMultipleTables);<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    fs.deleteOnExit(partitionsPath);<a name="line.850"></a>
+<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">852</span>    // configure job to use it<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    job.setPartitionerClass(TotalOrderPartitioner.class);<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);<a name="line.854"></a>
+<span class="sourceLineNo">855</span>  }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")<a name="line.857"></a>
+<span class="sourceLineNo">858</span>  @VisibleForTesting<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  static String serializeColumnFamilyAttribute(Function&lt;ColumnFamilyDescriptor, String&gt; fn, List&lt;TableDescriptor&gt; allTables)<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      throws UnsupportedEncodingException {<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    StringBuilder attributeValue = new StringBuilder();<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    int i = 0;<a name="line.862"></a>
+<span class="sourceLineNo">863</span>    for (TableDescriptor tableDescriptor : allTables) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      if (tableDescriptor == null) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        // could happen with mock table instance<a name="line.865"></a>
+<span class="sourceLineNo">866</span>        // CODEREVIEW: Can I set an empty string in conf if mock table instance?<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        return "";<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      for (ColumnFamilyDescriptor familyDescriptor : tableDescriptor.getColumnFamilies()) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>        if (i++ &gt; 0) {<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          attributeValue.append('&amp;');<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span>        attributeValue.append(URLEncoder.encode(<a name="line.873"></a>
+<span class="sourceLineNo">874</span>            Bytes.toString(combineTableNameSuffix(tableDescriptor.getTableName().getName(), familyDescriptor.getName())),<a name="line.874"></a>
+<span class="sourceLineNo">875</span>            "UTF-8"));<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        attributeValue.append('=');<a name="line.876"></a>
+<span class="sourceLineNo">877</span>        attributeValue.append(URLEncoder.encode(fn.apply(familyDescriptor), "UTF-8"));<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      }<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>    // Get rid of the last ampersand<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    return attributeValue.toString();<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  }<a name="line.882"></a>
+<span class="sourceLineNo">883</span><a name="line.883"></a>
+<span class="sourceLineNo">884</span>  /**<a name="line.884"></a>
+<span class="sourceLineNo">885</span>   * Serialize column family to compression algorithm map to configuration.<a name="line.885"></a>
+<span class="sourceLineNo">886</span>   * Invoked while configuring the MR job for incremental load.<a name="line.886"></a>
+<span class="sourceLineNo">887</span>   */<a name="line.887"></a>
+<span class="sourceLineNo">888</span>  @VisibleForTesting<a name="line.888"></a>
+<span class="sourceLineNo">889</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; compressionDetails = familyDescriptor -&gt;<a name="line.889"></a>
+<span class="sourceLineNo">890</span>          familyDescriptor.getCompressionType().getName();<a name="line.890"></a>
+<span class="sourceLineNo">891</span><a name="line.891"></a>
+<span class="sourceLineNo">892</span>  /**<a name="line.892"></a>
+<span class="sourceLineNo">893</span>   * Serialize column family to block size map to configuration. Invoked while<a name="line.893"></a>
+<span class="sourceLineNo">894</span>   * configuring the MR job for incremental load.<a name="line.894"></a>
+<span class="sourceLineNo">895</span>   */<a name="line.895"></a>
+<span class="sourceLineNo">896</span>  @VisibleForTesting<a name="line.896"></a>
+<span class="sourceLineNo">897</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; blockSizeDetails = familyDescriptor -&gt; String<a name="line.897"></a>
+<span class="sourceLineNo">898</span>          .valueOf(familyDescriptor.getBlocksize());<a name="line.898"></a>
+<span class="sourceLineNo">899</span><a name="line.899"></a>
+<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
+<span class="sourceLineNo">901</span>   * Serialize column family to bloom type map to configuration. Invoked while<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * configuring the MR job for incremental load.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   */<a name="line.903"></a>
+<span class="sourceLineNo">904</span>  @VisibleForTesting<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomTypeDetails = familyDescriptor -&gt; {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    String bloomType = familyDescriptor.getBloomFilterType().toString();<a name="line.906"></a>
+<span class="sourceLineNo">907</span>    if (bloomType == null) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>      bloomType = ColumnFamilyDescriptorBuilder.DEFAULT_BLOOMFILTER.name();<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    }<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    return bloomType;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>  };<a name="line.911"></a>
+<span class="sourceLineNo">912</span><a name="line.912"></a>
+<span class="sourceLineNo">913</span>  /**<a name="line.913"></a>
+<span class="sourceLineNo">914</span>   * Serialize column family to bloom param map to configuration. Invoked while<a name="line.914"></a>
+<span class="sourceLineNo">915</span>   * configuring the MR job for incremental load.<a name="line.915"></a>
+<span class="sourceLineNo">916</span>   */<a name="line.916"></a>
+<span class="sourceLineNo">917</span>  @VisibleForTesting<a name="line.917"></a>
+<span class="sourceLineNo">918</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    String bloomParam = "";<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.921"></a>
+<span class="sourceLineNo">922</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.922"></a>
 <span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    return bloomType;<a name="line.924"></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 bloom param map to configuration. Invoked while<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * configuring the MR job for incremental load.<a name="line.929"></a>
+<span class="sourceLineNo">928</span>   * Serialize column family to data block encoding map to configuration.<a name="line.928"></a>
+<span class="sourceLineNo">929</span>   * Invoked while configuring the MR job for incremental load.<a name="line.929"></a>
 <span class="sourceLineNo">930</span>   */<a name="line.930"></a>
 <span class="sourceLineNo">931</span>  @VisibleForTesting<a name="line.931"></a>
-<span class="sourceLineNo">932</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; bloomParamDetails = familyDescriptor -&gt; {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    BloomType bloomType = familyDescriptor.getBloomFilterType();<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    String bloomParam = "";<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    if (bloomType == BloomType.ROWPREFIX_FIXED_LENGTH) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      bloomParam = familyDescriptor.getConfigurationValue(BloomFilterUtil.PREFIX_LENGTH_KEY);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    return bloomParam;<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">941</span>  /**<a name="line.941"></a>
-<span class="sourceLineNo">942</span>   * Serialize column family to data block encoding map to configuration.<a name="line.942"></a>
-<span class="sourceLineNo">943</span>   * Invoked while configuring the MR job for incremental load.<a name="line.943"></a>
-<span class="sourceLineNo">944</span>   */<a name="line.944"></a>
-<span class="sourceLineNo">945</span>  @VisibleForTesting<a name="line.945"></a>
-<span class="sourceLineNo">946</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    if (encoding == null) {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      encoding = DataBlockEncoding.NONE;<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    return encoding.toString();<a name="line.951"></a>
-<span class="sourceLineNo">952</span>  };<a name="line.952"></a>
-<span class="sourceLineNo">953</span><a name="line.953"></a>
-<span class="sourceLineNo">954</span>}<a name="line.954"></a>
+<span class="sourceLineNo">932</span>  static Function&lt;ColumnFamilyDescriptor, String&gt; dataBlockEncodingDetails = familyDescriptor -&gt; {<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    DataBlockEncoding encoding = familyDescriptor.getDataBlockEncoding();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>    if (encoding == null) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      encoding = DataBlockEncoding.NONE;<a name="line.935"></a>
+<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    return encoding.toString();<a name="line.937"></a>
+<span class="sourceLineNo">938</span>  };<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>}<a name="line.940"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index 01861a7..a3df295 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -275,882 +275,883 @@
 <span class="sourceLineNo">267</span>      return new Path(outputArchive, path);<a name="line.267"></a>
 <span class="sourceLineNo">268</span>    }<a name="line.268"></a>
 <span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /**<a name="line.270"></a>
-<span class="sourceLineNo">271</span>     * Used by TestExportSnapshot to test for retries when failures happen.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>     * Failure is injected in {@link #copyFile(Context, SnapshotFileInfo, Path)}.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>     */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private void injectTestFailure(final Context context, final SnapshotFileInfo inputInfo)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        throws IOException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (!context.getConfiguration().getBoolean(Testing.CONF_TEST_FAILURE, false)) return;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      if (testing.injectedFailureCount &gt;= testing.failuresCountToInject) return;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      testing.injectedFailureCount++;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      context.getCounter(Counter.COPY_FAILED).increment(1);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      LOG.debug("Injecting failure. Count: " + testing.injectedFailureCount);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      throw new IOException(String.format("TEST FAILURE (%d of max %d): Unable to copy input=%s",<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          testing.injectedFailureCount, testing.failuresCountToInject, inputInfo));<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>    private void copyFile(final Context context, final SnapshotFileInfo inputInfo,<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        final Path outputPath) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // Get the file information<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      FileStatus inputStat = getSourceFileStatus(context, inputInfo);<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>      // Verify if the output file exists and is the same that we want to copy<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      if (outputFs.exists(outputPath)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        FileStatus outputStat = outputFs.getFileStatus(outputPath);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        if (outputStat != null &amp;&amp; sameFile(inputStat, outputStat)) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          LOG.info("Skip copy " + inputStat.getPath() + " to " + outputPath + ", same file.");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          context.getCounter(Counter.FILES_SKIPPED).increment(1);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          context.getCounter(Counter.BYTES_SKIPPED).increment(inputStat.getLen());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          return;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      }<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      InputStream in = openSourceFile(context, inputInfo);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      int bandwidthMB = context.getConfiguration().getInt(CONF_BANDWIDTH_MB, 100);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      if (Integer.MAX_VALUE != bandwidthMB) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        in = new ThrottledInputStream(new BufferedInputStream(in), bandwidthMB * 1024 * 1024L);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      }<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>      try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        context.getCounter(Counter.BYTES_EXPECTED).increment(inputStat.getLen());<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>        // Ensure that the output folder is there and copy the file<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        createOutputPath(outputPath.getParent());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        FSDataOutputStream out = outputFs.create(outputPath, true);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>          copyData(context, inputStat.getPath(), in, outputPath, out, inputStat.getLen());<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        } finally {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          out.close();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>        // Try to Preserve attributes<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        if (!preserveAttributes(outputPath, inputStat)) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          LOG.warn("You may have to run manually chown on: " + outputPath);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      } finally {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        in.close();<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        injectTestFailure(context, inputInfo);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    /**<a name="line.329"></a>
-<span class="sourceLineNo">330</span>     * Create the output folder and optionally set ownership.<a name="line.330"></a>
-<span class="sourceLineNo">331</span>     */<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    private void createOutputPath(final Path path) throws IOException {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      if (filesUser == null &amp;&amp; filesGroup == null) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        outputFs.mkdirs(path);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      } else {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        Path parent = path.getParent();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        if (!outputFs.exists(parent) &amp;&amp; !parent.isRoot()) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          createOutputPath(parent);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        outputFs.mkdirs(path);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        if (filesUser != null || filesGroup != null) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          // override the owner when non-null user/group is specified<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          outputFs.setOwner(path, filesUser, filesGroup);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        if (filesMode &gt; 0) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          outputFs.setPermission(path, new FsPermission(filesMode));<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        }<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>    /**<a name="line.351"></a>
-<span class="sourceLineNo">352</span>     * Try to Preserve the files attribute selected by the user copying them from the source file<a name="line.352"></a>
-<span class="sourceLineNo">353</span>     * This is only required when you are exporting as a different user than "hbase" or on a system<a name="line.353"></a>
-<span class="sourceLineNo">354</span>     * that doesn't have the "hbase" user.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>     *<a name="line.355"></a>
-<span class="sourceLineNo">356</span>     * This is not considered a blocking failure since the user can force a chmod with the user<a name="line.356"></a>
-<span class="sourceLineNo">357</span>     * that knows is available on the system.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>     */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    private boolean preserveAttributes(final Path path, final FileStatus refStat) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      FileStatus stat;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      try {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        stat = outputFs.getFileStatus(path);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      } catch (IOException e) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        LOG.warn("Unable to get the status for file=" + path);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        return false;<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>      try {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        if (filesMode &gt; 0 &amp;&amp; stat.getPermission().toShort() != filesMode) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          outputFs.setPermission(path, new FsPermission(filesMode));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        } else if (refStat != null &amp;&amp; !stat.getPermission().equals(refStat.getPermission())) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          outputFs.setPermission(path, refStat.getPermission());<a name="line.372"></a>
-<span class="sourceLineNo">373</span>        }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      } catch (IOException e) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        LOG.warn("Unable to set the permission for file="+ stat.getPath() +": "+ e.getMessage());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        return false;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      }<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>      boolean hasRefStat = (refStat != null);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      String user = stringIsNotEmpty(filesUser) || !hasRefStat ? filesUser : refStat.getOwner();<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      String group = stringIsNotEmpty(filesGroup) || !hasRefStat ? filesGroup : refStat.getGroup();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (stringIsNotEmpty(user) || stringIsNotEmpty(group)) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        try {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          if (!(user.equals(stat.getOwner()) &amp;&amp; group.equals(stat.getGroup()))) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>            outputFs.setOwner(path, user, group);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        } catch (IOException e) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          LOG.warn("Unable to set the owner/group for file="+ stat.getPath() +": "+ e.getMessage());<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          LOG.warn("The user/group may not exist on the destination cluster: user=" +<a name="line.389"></a>
-<span class="sourceLineNo">390</span>                   user + " group=" + group);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          return false;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      }<a name="line.393"></a>
-<span class="sourceLineNo">394</span><a name="line.394"></a>
-<span class="sourceLineNo">395</span>      return true;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>    private boolean stringIsNotEmpty(final String str) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      return str != null &amp;&amp; str.length() &gt; 0;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>    private void copyData(final Context context,<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        final Path inputPath, final InputStream in,<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        final Path outputPath, final FSDataOutputStream out,<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        final long inputFileSize)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        throws IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      final String statusMessage = "copied %s/" + StringUtils.humanReadableInt(inputFileSize) +<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                                   " (%.1f%%)";<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        byte[] buffer = new byte[bufferSize];<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        long totalBytesWritten = 0;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        int reportBytes = 0;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        int bytesRead;<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>        long stime = System.currentTimeMillis();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        while ((bytesRead = in.read(buffer)) &gt; 0) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>          out.write(buffer, 0, bytesRead);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          totalBytesWritten += bytesRead;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          reportBytes += bytesRead;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>          if (reportBytes &gt;= REPORT_SIZE) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>            context.getCounter(Counter.BYTES_COPIED).increment(reportBytes);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>            context.setStatus(String.format(statusMessage,<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                              StringUtils.humanReadableInt(totalBytesWritten),<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                              (totalBytesWritten/(float)inputFileSize) * 100.0f) +<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                              " from " + inputPath + " to " + outputPath);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>            reportBytes = 0;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        long etime = System.currentTimeMillis();<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>        context.getCounter(Counter.BYTES_COPIED).increment(reportBytes);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        context.setStatus(String.format(statusMessage,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>                          StringUtils.humanReadableInt(totalBytesWritten),<a name="line.435"></a>
-<span class="sourceLineNo">436</span>                          (totalBytesWritten/(float)inputFileSize) * 100.0f) +<a name="line.436"></a>
-<span class="sourceLineNo">437</span>                          " from " + inputPath + " to " + outputPath);<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>        // Verify that the written size match<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        if (totalBytesWritten != inputFileSize) {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>          String msg = "number of bytes copied not matching copied=" + totalBytesWritten +<a name="line.441"></a>
-<span class="sourceLineNo">442</span>                       " expected=" + inputFileSize + " for file=" + inputPath;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>          throw new IOException(msg);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        }<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>        LOG.info("copy completed for input=" + inputPath + " output=" + outputPath);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        LOG.info("size=" + totalBytesWritten +<a name="line.447"></a>
-<span class="sourceLineNo">448</span>            " (" + StringUtils.humanReadableInt(totalBytesWritten) + ")" +<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            " time=" + StringUtils.formatTimeDiff(etime, stime) +<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            String.format(" %.3fM/sec", (totalBytesWritten / ((etime - stime)/1000.0))/1048576.0));<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        context.getCounter(Counter.FILES_COPIED).increment(1);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      } catch (IOException e) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        LOG.error("Error copying " + inputPath + " to " + outputPath, e);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        context.getCounter(Counter.COPY_FAILED).increment(1);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        throw e;<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>    /**<a name="line.459"></a>
-<span class="sourceLineNo">460</span>     * Try to open the "source" file.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>     * Throws an IOException if the communication with the inputFs fail or<a name="line.461"></a>
-<span class="sourceLineNo">462</span>     * if the file is not found.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>     */<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    private FSDataInputStream openSourceFile(Context context, final SnapshotFileInfo fileInfo)<a name="line.464"></a>
-<span class="sourceLineNo">465</span>            throws IOException {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      try {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        Configuration conf = context.getConfiguration();<a name="line.467"></a>
-<span class="sourceLineNo">468</span>        FileLink link = null;<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        switch (fileInfo.getType()) {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          case HFILE:<a name="line.470"></a>
-<span class="sourceLineNo">471</span>            Path inputPath = new Path(fileInfo.getHfile());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>            link = getFileLink(inputPath, conf);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>            break;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          case WAL:<a name="line.474"></a>
-<span class="sourceLineNo">475</span>            String serverName = fileInfo.getWalServer();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>            String logName = fileInfo.getWalName();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>            link = new WALLink(inputRoot, serverName, logName);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            break;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>          default:<a name="line.479"></a>
-<span class="sourceLineNo">480</span>            throw new IOException("Invalid File Type: " + fileInfo.getType().toString());<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        return link.open(inputFs);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      } catch (IOException e) {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        context.getCounter(Counter.MISSING_FILES).increment(1);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>        LOG.error("Unable to open source file=" + fileInfo.toString(), e);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        throw e;<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><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    private FileStatus getSourceFileStatus(Context context, final SnapshotFileInfo fileInfo)<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        throws IOException {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      try {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        Configuration conf = context.getConfiguration();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        FileLink link = null;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        switch (fileInfo.getType()) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>          case HFILE:<a name="line.496"></a>
-<span class="sourceLineNo">497</span>            Path inputPath = new Path(fileInfo.getHfile());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>            link = getFileLink(inputPath, conf);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            break;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          case WAL:<a name="line.500"></a>
-<span class="sourceLineNo">501</span>            link = new WALLink(inputRoot, fileInfo.getWalServer(), fileInfo.getWalName());<a name="line.501"></a>
-<span class="sourceLineNo">502</span>            break;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          default:<a name="line.503"></a>
-<span class="sourceLineNo">504</span>            throw new IOException("Invalid File Type: " + fileInfo.getType().toString());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        }<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        return link.getFileStatus(inputFs);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      } catch (FileNotFoundException e) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        context.getCounter(Counter.MISSING_FILES).increment(1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        LOG.error("Unable to get the status for source file=" + fileInfo.toString(), e);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        throw e;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      } catch (IOException e) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        LOG.error("Unable to get the status for source file=" + fileInfo.toString(), e);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>        throw e;<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><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    private FileLink getFileLink(Path path, Configuration conf) throws IOException{<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      String regionName = HFileLink.getReferencedRegionName(path.getName());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      TableName tableName = HFileLink.getReferencedTableName(path.getName());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      if(MobUtils.getMobRegionInfo(tableName).getEncodedName().equals(regionName)) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        return HFileLink.buildFromHFileLinkPattern(MobUtils.getQualifiedMobRootDir(conf),<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                HFileArchiveUtil.getArchivePath(conf), path);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      return HFileLink.buildFromHFileLinkPattern(inputRoot, inputArchive, path);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    private FileChecksum getFileChecksum(final FileSystem fs, final Path path) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      try {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        return fs.getFileChecksum(path);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      } catch (IOException e) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        LOG.warn("Unable to get checksum for file=" + path, e);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        return null;<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><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    /**<a name="line.536"></a>
-<span class="sourceLineNo">537</span>     * Check if the two files are equal by looking at the file length,<a name="line.537"></a>
-<span class="sourceLineNo">538</span>     * and at the checksum (if user has specified the verifyChecksum flag).<a name="line.538"></a>
-<span class="sourceLineNo">539</span>     */<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    private boolean sameFile(final FileStatus inputStat, final FileStatus outputStat) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // Not matching length<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (inputStat.getLen() != outputStat.getLen()) return false;<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>      // Mark files as equals, since user asked for no checksum verification<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      if (!verifyChecksum) return true;<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>      // If checksums are not available, files are not the same.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      FileChecksum inChecksum = getFileChecksum(inputFs, inputStat.getPath());<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      if (inChecksum == null) return false;<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>      FileChecksum outChecksum = getFileChecksum(outputFs, outputStat.getPath());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      if (outChecksum == null) return false;<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>      return inChecksum.equals(outChecksum);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
-<span class="sourceLineNo">556</span>  }<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>  // ==========================================================================<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  //  Input Format<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>   * Extract the list of files (HFiles/WALs) to copy using Map-Reduce.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   * @return list of files referenced by the snapshot (pair of path and size)<a name="line.564"></a>
-<span class="sourceLineNo">565</span>   */<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  private static List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; getSnapshotFiles(final Configuration conf,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      final FileSystem fs, final Path snapshotDir) throws IOException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    SnapshotDescription snapshotDesc = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; files = new ArrayList&lt;&gt;();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final TableName table = TableName.valueOf(snapshotDesc.getTable());<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    // Get snapshot files<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    LOG.info("Loading Snapshot '" + snapshotDesc.getName() + "' hfile list");<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    SnapshotReferenceUtil.visitReferencedFiles(conf, fs, snapshotDir, snapshotDesc,<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      new SnapshotReferenceUtil.SnapshotVisitor() {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        @Override<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        public void storeFile(final RegionInfo regionInfo, final String family,<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            final SnapshotRegionManifest.StoreFile storeFile) throws IOException {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          // for storeFile.hasReference() case, copied as part of the manifest<a name="line.580"></a>
-<span class="sourceLineNo">581</span>          if (!storeFile.hasReference()) {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>            String region = regionInfo.getEncodedName();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            String hfile = storeFile.getName();<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            Path path = HFileLink.createPath(table, region, family, hfile);<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>            SnapshotFileInfo fileInfo = SnapshotFileInfo.newBuilder()<a name="line.586"></a>
-<span class="sourceLineNo">587</span>              .setType(SnapshotFileInfo.Type.HFILE)<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              .setHfile(path.toString())<a name="line.588"></a>
-<span class="sourceLineNo">589</span>              .build();<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>            long size;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>            if (storeFile.hasFileSize()) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>              size = storeFile.getFileSize();<a name="line.593"></a>
-<span class="sourceLineNo">594</span>            } else {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>              size = HFileLink.buildFromHFileLinkPattern(conf, path).getFileStatus(fs).getLen();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>            }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>            files.add(new Pair&lt;&gt;(fileInfo, size));<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          }<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    });<a name="line.600"></a>
-<span class="sourceLineNo">601</span><a name="line.601"></a>
-<span class="sourceLineNo">602</span>    return files;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  }<a name="line.603"></a>
-<span class="sourceLineNo">604</span><a name="line.604"></a>
-<span class="sourceLineNo">605</span>  /**<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   * Given a list of file paths and sizes, create around ngroups in as balanced a way as possible.<a name="line.606"></a>
-<span class="sourceLineNo">607</span>   * The groups created will have similar amounts of bytes.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * &lt;p&gt;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * The algorithm used is pretty straightforward; the file list is sorted by size,<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * and then each group fetch the bigger file available, iterating through groups<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * alternating the direction.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   */<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  static List&lt;List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;&gt; getBalancedSplits(<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      final List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; files, final int ngroups) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    // Sort files by size, from small to big<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Collections.sort(files, new Comparator&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;() {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      public int compare(Pair&lt;SnapshotFileInfo, Long&gt; a, Pair&lt;SnapshotFileInfo, Long&gt; b) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        long r = a.getSecond() - b.getSecond();<a name="line.618"></a>
-<span class="sourceLineNo">619</span>        return (r &lt; 0) ? -1 : ((r &gt; 0) ? 1 : 0);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    });<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>    // create balanced groups<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    List&lt;List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;&gt; fileGroups = new LinkedList&lt;&gt;();<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    long[] sizeGroups = new long[ngroups];<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    int hi = files.size() - 1;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    int lo = 0;<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; group;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    int dir = 1;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int g = 0;<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>    while (hi &gt;= lo) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      if (g == fileGroups.size()) {<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        group = new LinkedList&lt;&gt;();<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        fileGroups.add(group);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      } else {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        group = fileGroups.get(g);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>      Pair&lt;SnapshotFileInfo, Long&gt; fileInfo = files.get(hi--);<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>      // add the hi one<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      sizeGroups[g] += fileInfo.getSecond();<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      group.add(fileInfo);<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>      // change direction when at the end or the beginning<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      g += dir;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      if (g == ngroups) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        dir = -1;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        g = ngroups - 1;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      } else if (g &lt; 0) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>        dir = 1;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>        g = 0;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    if (LOG.isDebugEnabled()) {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      for (int i = 0; i &lt; sizeGroups.length; ++i) {<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        LOG.debug("export split=" + i + " size=" + StringUtils.humanReadableInt(sizeGroups[i]));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      }<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    }<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    return fileGroups;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>  }<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private static class ExportSnapshotInputFormat extends InputFormat&lt;BytesWritable, NullWritable&gt; {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    @Override<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    public RecordReader&lt;BytesWritable, NullWritable&gt; createRecordReader(InputSplit split,<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        TaskAttemptContext tac) throws IOException, InterruptedException {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      return new ExportSnapshotRecordReader(((ExportSnapshotInputSplit)split).getSplitKeys());<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    @Override<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    public List&lt;InputSplit&gt; getSplits(JobContext context) throws IOException, InterruptedException {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Configuration conf = context.getConfiguration();<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      Path snapshotDir = new Path(conf.get(CONF_SNAPSHOT_DIR));<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      FileSystem fs = FileSystem.get(snapshotDir.toUri(), conf);<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>      List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; snapshotFiles = getSnapshotFiles(conf, fs, snapshotDir);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      int mappers = conf.getInt(CONF_NUM_SPLITS, 0);<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      if (mappers == 0 &amp;&amp; snapshotFiles.size() &gt; 0) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>        mappers = 1 + (snapshotFiles.size() / conf.getInt(CONF_MAP_GROUP, 10));<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        mappers = Math.min(mappers, snapshotFiles.size());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>        conf.setInt(CONF_NUM_SPLITS, mappers);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        conf.setInt(MR_NUM_MAPS, mappers);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      }<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      List&lt;List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;&gt; groups = getBalancedSplits(snapshotFiles, mappers);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      List&lt;InputSplit&gt; splits = new ArrayList(groups.size());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      for (List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; files: groups) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>        splits.add(new ExportSnapshotInputSplit(files));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      return splits;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>    private static class ExportSnapshotInputSplit extends InputSplit implements Writable {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      private List&lt;Pair&lt;BytesWritable, Long&gt;&gt; files;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      private long length;<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      public ExportSnapshotInputSplit() {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        this.files = null;<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      }<a name="line.703"></a>
-<span class="sourceLineNo">704</span><a name="line.704"></a>
-<span class="sourceLineNo">705</span>      public ExportSnapshotInputSplit(final List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; snapshotFiles) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        this.files = new ArrayList(snapshotFiles.size());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>        for (Pair&lt;SnapshotFileInfo, Long&gt; fileInfo: snapshotFiles) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>          this.files.add(new Pair&lt;&gt;(<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            new BytesWritable(fileInfo.getFirst().toByteArray()), fileInfo.getSecond()));<a name="line.709"></a>
-<span class="sourceLineNo">710</span>          this.length += fileInfo.getSecond();<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        }<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>      private List&lt;Pair&lt;BytesWritable, Long&gt;&gt; getSplitKeys() {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>        return files;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      }<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>      @Override<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      public long getLength() throws IOException, InterruptedException {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        return length;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>      @Override<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      public String[] getLocations() throws IOException, InterruptedException {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        return new String[] {};<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>      @Override<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      public void readFields(DataInput in) throws IOException {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>        int count = in.readInt();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>        files = new ArrayList&lt;&gt;(count);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        length = 0;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>        for (int i = 0; i &lt; count; ++i) {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>          BytesWritable fileInfo = new BytesWritable();<a name="line.734"></a>
-<span class="sourceLineNo">735</span>          fileInfo.readFields(in);<a name="line.735"></a>
-<span class="sourceLineNo">736</span>          long size = in.readLong();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          files.add(new Pair&lt;&gt;(fileInfo, size));<a name="line.737"></a>
-<span class="sourceLineNo">738</span>          length += size;<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      @Override<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      public void write(DataOutput out) throws IOException {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        out.writeInt(files.size());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        for (final Pair&lt;BytesWritable, Long&gt; fileInfo: files) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>          fileInfo.getFirst().write(out);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>          out.writeLong(fileInfo.getSecond());<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><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    private static class ExportSnapshotRecordReader<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        extends RecordReader&lt;BytesWritable, NullWritable&gt; {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      private final List&lt;Pair&lt;BytesWritable, Long&gt;&gt; files;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      private long totalSize = 0;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      private long procSize = 0;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>      private int index = -1;<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>      ExportSnapshotRecordReader(final List&lt;Pair&lt;BytesWritable, Long&gt;&gt; files) {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        this.files = files;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        for (Pair&lt;BytesWritable, Long&gt; fileInfo: files) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>          totalSize += fileInfo.getSecond();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>      @Override<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      public void close() { }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>      @Override<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      public BytesWritable getCurrentKey() { return files.get(index).getFirst(); }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>      @Override<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      public NullWritable getCurrentValue() { return NullWritable.get(); }<a name="line.773"></a>
-<span class="sourceLineNo">774</span><a name="line.774"></a>
-<span class="sourceLineNo">775</span>      @Override<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      public float getProgress() { return (float)procSize / totalSize; }<a name="line.776"></a>
-<span class="sourceLineNo">777</span><a name="line.777"></a>
-<span class="sourceLineNo">778</span>      @Override<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      public void initialize(InputSplit split, TaskAttemptContext tac) { }<a name="line.779"></a>
-<span class="sourceLineNo">780</span><a name="line.780"></a>
-<span class="sourceLineNo">781</span>      @Override<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      public boolean nextKeyValue() {<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        if (index &gt;= 0) {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>          procSize += files.get(index).getSecond();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>        }<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        return(++index &lt; files.size());<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      }<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  // ==========================================================================<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  //  Tool<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  // ==========================================================================<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>  /**<a name="line.795"></a>
-<span class="sourceLineNo">796</span>   * Run Map-Reduce Job to perform the files copy.<a name="line.796"></a>
-<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
-<span class="sourceLineNo">798</span>  private void runCopyJob(final Path inputRoot, final Path outputRoot,<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      final String snapshotName, final Path snapshotDir, final boolean verifyChecksum,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      final String filesUser, final String filesGroup, final int filesMode,<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      final int mappers, final int bandwidthMB)<a name="line.801"></a>
-<span class="sourceLineNo">802</span>          throws IOException, InterruptedException, ClassNotFoundException {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    Configuration conf = getConf();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    if (filesGroup != null) conf.set(CONF_FILES_GROUP, filesGroup);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    if (filesUser != null) conf.set(CONF_FILES_USER, filesUser);<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    if (mappers &gt; 0) {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      conf.setInt(CONF_NUM_SPLITS, mappers);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>      conf.setInt(MR_NUM_MAPS, mappers);<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    }<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    conf.setInt(CONF_FILES_MODE, filesMode);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    conf.setBoolean(CONF_CHECKSUM_VERIFY, verifyChecksum);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    conf.set(CONF_OUTPUT_ROOT, outputRoot.toString());<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    conf.set(CONF_INPUT_ROOT, inputRoot.toString());<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    conf.setInt(CONF_BANDWIDTH_MB, bandwidthMB);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    conf.set(CONF_SNAPSHOT_NAME, snapshotName);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    conf.set(CONF_SNAPSHOT_DIR, snapshotDir.toString());<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    String jobname = conf.get(CONF_MR_JOB_NAME, "ExportSnapshot-" + snapshotName);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>    Job job = new Job(conf);<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    job.setJobName(jobname);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    job.setJarByClass(ExportSnapshot.class);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    job.setMapperClass(ExportMapper.class);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    job.setInputFormatClass(ExportSnapshotInputFormat.class);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    job.setMapSpeculativeExecution(false);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    job.setNumReduceTasks(0);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    // Acquire the delegation Tokens<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    Configuration srcConf = HBaseConfiguration.createClusterConf(conf, null, CONF_SOURCE_PREFIX);<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    TokenCache.obtainTokensForNamenodes(job.getCredentials(),<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      new Path[] { inputRoot }, srcConf);<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    Configuration destConf = HBaseConfiguration.createClusterConf(conf, null, CONF_DEST_PREFIX);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    TokenCache.obtainTokensForNamenodes(job.getCredentials(),<a name="line.834"></a>
-<span class="sourceLineNo">835</span>        new Path[] { outputRoot }, destConf);<a name="line.835"></a>
-<span class="sourceLineNo">836</span><a name="line.836"></a>
-<span class="sourceLineNo">837</span>    // Run the MR Job<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    if (!job.waitForCompletion(true)) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      throw new ExportSnapshotException(job.getStatus().getFailureInfo());<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>  }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>  private void verifySnapshot(final Configuration baseConf,<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      final FileSystem fs, final Path rootDir, final Path snapshotDir) throws IOException {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    // Update the conf with the current root dir, since may be a different cluster<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    Configuration conf = new Configuration(baseConf);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    FSUtils.setRootDir(conf, rootDir);<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    FSUtils.setFsDefault(conf, FSUtils.getRootDir(conf));<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    SnapshotDescription snapshotDesc = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    SnapshotReferenceUtil.verifySnapshot(conf, fs, snapshotDir, snapshotDesc);<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>  private void setConfigParallel(FileSystem outputFs, List&lt;Path&gt; traversedPath,<a name="line.853"></a>
-<span class="sourceLineNo">854</span>      BiConsumer&lt;FileSystem, Path&gt; task, Configuration conf) throws IOException {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    ExecutorService pool = Executors<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        .newFixedThreadPool(conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    List&lt;Future&lt;Void&gt;&gt; futures = new ArrayList&lt;&gt;();<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    for (Path dstPath : traversedPath) {<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      Future&lt;Void&gt; future = (Future&lt;Void&gt;) pool.submit(() -&gt; task.accept(outputFs, dstPath));<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      futures.add(future);<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    try {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      for (Future&lt;Void&gt; future : futures) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>        future.get();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      }<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    } catch (InterruptedException | ExecutionException e) {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      throw new IOException(e);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    } finally {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      pool.shutdownNow();<a name="line.869"></a>
-<span class="sourceLineNo">870</span>    }<a name="line.870"></a>
-<span class="sourceLineNo">871</span>  }<a name="line.871"></a>
-<span class="sourceLineNo">872</span><a name="line.872"></a>
-<span class="sourceLineNo">873</span>  private void setOwnerParallel(FileSystem outputFs, String filesUser, String filesGroup,<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      Configuration conf, List&lt;Path&gt; traversedPath) throws IOException {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    setConfigParallel(outputFs, traversedPath, (fs, path) -&gt; {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      try {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        fs.setOwner(path, filesUser, filesGroup);<a name="line.877"></a>
-<span class="sourceLineNo">878</span>      } catch (IOException e) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        throw new RuntimeException(<a name="line.879"></a>
-<span class="sourceLineNo">880</span>            "set owner for file " + path + " to " + filesUser + ":" + filesGroup + " failed", e);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      }<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    }, conf);<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>  private void setPermissionParallel(final FileSystem outputFs, final short filesMode,<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      final List&lt;Path&gt; traversedPath, final Configuration conf) throws IOException {<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    if (filesMode &lt;= 0) {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>      return;<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    }<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    FsPermission perm = new FsPermission(filesMode);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    setConfigParallel(outputFs, traversedPath, (fs, path) -&gt; {<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        fs.setPermission(path, perm);<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      } catch (IOException e) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        throw new RuntimeException(<a name="line.895"></a>
-<span class="sourceLineNo">896</span>            "set permission for file " + path + " to " + filesMode + " failed", e);<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    }, conf);<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>  private boolean verifyTarget = true;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>  private boolean verifyChecksum = true;<a name="line.902"></a>
-<span class="sourceLineNo">903</span>  private String snapshotName = null;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>  private String targetName = null;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  private boolean overwrite = false;<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  private String filesGroup = null;<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  private String filesUser = null;<a name="line.907"></a>
-<span class="sourceLineNo">908</span>  private Path outputRoot = null;<a name="line.908"></a>
-<span class="sourceLineNo">909</span>  private Path inputRoot = null;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  private int bandwidthMB = Integer.MAX_VALUE;<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  private int filesMode = 0;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>  private int mappers = 0;<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>  @Override<a name="line.914"></a>
-<span class="sourceLineNo">915</span>  protected void processOptions(CommandLine cmd) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    snapshotName = cmd.getOptionValue(Options.SNAPSHOT.getLongOpt(), snapshotName);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    targetName = cmd.getOptionValue(Options.TARGET_NAME.getLongOpt(), targetName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    if (cmd.hasOption(Options.COPY_TO.getLongOpt())) {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      outputRoot = new Path(cmd.getOptionValue(Options.COPY_TO.getLongOpt()));<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    }<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    if (cmd.hasOption(Options.COPY_FROM.getLongOpt())) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      inputRoot = new Path(cmd.getOptionValue(Options.COPY_FROM.getLongOpt()));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    mappers = getOptionAsInt(cmd, Options.MAPPERS.getLongOpt(), mappers);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    filesUser = cmd.getOptionValue(Options.CHUSER.getLongOpt(), filesUser);<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    filesGroup = cmd.getOptionValue(Options.CHGROUP.getLongOpt(), filesGroup);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    filesMode = getOptionAsInt(cmd, Options.CHMOD.getLongOpt(), filesMode);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    bandwidthMB = getOptionAsInt(cmd, Options.BANDWIDTH.getLongOpt(), bandwidthMB);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    overwrite = cmd.hasOption(Options.OVERWRITE.getLongOpt());<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    // And verifyChecksum and verifyTarget with values read from old args in processOldArgs(...).<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    verifyChecksum = !cmd.hasOption(Options.NO_CHECKSUM_VERIFY.getLongOpt());<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    verifyTarget = !cmd.hasOption(Options.NO_TARGET_VERIFY.getLongOpt());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>  }<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>   * Execute the export snapshot by copying the snapshot metadata, hfiles and wals.<a name="line.936"></a>
-<span class="sourceLineNo">937</span>   * @return 0 on success, and != 0 upon failure.<a name="line.937"></a>
-<span class="sourceLineNo">938</span>   */<a name="line.938"></a>
-<span class="sourceLineNo">939</span>  @Override<a name="line.939"></a>
-<span class="sourceLineNo">940</span>  public int doWork() throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    Configuration conf = getConf();<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    // Check user options<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    if (snapshotName == null) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>      System.err.println("Snapshot name not provided.");<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      LOG.error("Use -h or --help for usage instructions.");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      return 0;<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    if (outputRoot == null) {<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      System.err.println("Destination file-system (--" + Options.COPY_TO.getLongOpt()<a name="line.951"></a>
-<span class="sourceLineNo">952</span>              + ") not provided.");<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      LOG.error("Use -h or --help for usage instructions.");<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      return 0;<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span><a name="line.956"></a>
-<span class="sourceLineNo">957</span>    if (targetName == null) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      targetName = snapshotName;<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (inputRoot == null) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      inputRoot = FSUtils.getRootDir(conf);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    } else {<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      FSUtils.setRootDir(conf, inputRoot);<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>    Configuration srcConf = HBaseConfiguration.createClusterConf(conf, null, CONF_SOURCE_PREFIX);<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    srcConf.setBoolean("fs." + inputRoot.toUri().getScheme() + ".impl.disable.cache", true);<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    FileSystem inputFs = FileSystem.get(inputRoot.toUri(), srcConf);<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    LOG.debug("inputFs=" + inputFs.getUri().toString() + " inputRoot=" + inputRoot);<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    Configuration destConf = HBaseConfiguration.createClusterConf(conf, null, CONF_DEST_PREFIX);<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    destConf.setBoolean("fs." + outputRoot.toUri().getScheme() + ".impl.disable.cache", true);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>    FileSystem outputFs = FileSystem.get(outputRoot.toUri(), destConf);<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    LOG.debug("outputFs=" + outputFs.getUri().toString() + " outputRoot=" + outputRoot.toString());<a name="line.973"></a>
-<span class="sourceLineNo">974</span><a name="line.974"></a>
-<span class="sourceLineNo">975</span>    boolean skipTmp = conf.getBoolean(CONF_SKIP_TMP, false) ||<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        conf.get(SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR) != null;<a name="line.976"></a>
-<span class="sourceLineNo">977</span><a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot,<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        destConf);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.982"></a>
-<span class="sourceLineNo">983</span><a name="line.983"></a>
-<span class="sourceLineNo">984</span>    // Find the necessary directory which need to change owner and group<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      if (skipTmp) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      } else {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot, destConf);<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        }<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>    // Check if the snapshot already exists<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>      if (overwrite) {<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>          return 1;<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        }<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      } else {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        System.err.println("The snapshot '" + targetName +<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>        return 1;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    }<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span><a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    if (!skipTmp) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      // Check if the snapshot already in-progress<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        if (overwrite) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            return 1;<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        } else {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          return 1;<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>        }<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    }<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span><a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    // will remove them because they are unreferenced.<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    boolean copySucceeded = false;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      travesedPaths =<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      copySucceeded = true;<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    } catch (IOException e) {<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    } finally {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>      if (copySucceeded) {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>        if (filesUser != null || filesGroup != null) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>              + filesUser)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>                  + filesGroup));<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>        }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        if (filesMode &gt; 0) {<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<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>    }<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span><a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (!targetName.equals(snapshotName)) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      SnapshotDescription snapshotDesc =<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .toBuilder()<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>          .setName(targetName)<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>          .build();<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>      if (filesUser != null || filesGroup != null) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      if (filesMode &gt; 0) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span><a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // Step 2 - Start MR Job to copy files<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    // by the HFileArchiver, since they have no references.<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    try {<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span><a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      if (!skipTmp) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>        }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>      // Step 4 - Verify snapshot integrity<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (verifyTarget) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>        LOG.info("Verify snapshot integrity");<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      }<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span><a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      LOG.info("Export Completed: " + targetName);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      return 0;<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    } catch (Exception e) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>      LOG.error("Snapshot export failed", e);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!skipTmp) {<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      return 1;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>    } finally {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      IOUtils.closeStream(inputFs);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>      IOUtils.closeStream(outputFs);<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  }<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span><a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>  @Override<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>  protected void printUsage() {<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    super.printUsage();<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    System.out.println("\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "Examples:\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "  hbase snapshot export \\\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "  hbase snapshot export \\\n"<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span><a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>  @Override protected void addOptions() {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.COPY_TO);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.COPY_FROM);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.TARGET_NAME);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.OVERWRITE);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHUSER);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.CHGROUP);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.CHMOD);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    addOption(Options.MAPPERS);<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    addOption(Options.BANDWIDTH);<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  }<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span><a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  public static void main(String[] args) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>}<a name="line.1145"></a>
+<span class="sourceLineNo">270</span>    @SuppressWarnings("checkstyle:linelength")<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>     * Used by TestExportSnapshot to test for retries when failures happen.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>     * Failure is injected in {@link #copyFile(Mapper.Context, org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotFileInfo, Path)}.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>     */<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    private void injectTestFailure(final Context context, final SnapshotFileInfo inputInfo)<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      if (!context.getConfiguration().getBoolean(Testing.CONF_TEST_FAILURE, false)) return;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      if (testing.injectedFailureCount &gt;= testing.failuresCountToInject) return;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      testing.injectedFailureCount++;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      context.getCounter(Counter.COPY_FAILED).increment(1);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      LOG.debug("Injecting failure. Count: " + testing.injectedFailureCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new IOException(String.format("TEST FAILURE (%d of max %d): Unable to copy input=%s",<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          testing.injectedFailureCount, testing.failuresCountToInject, inputInfo));<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
+<span class="sourceLineNo">285</span><a name="line.285"></a>
+<span class="sourceLineNo">286</span>    private void copyFile(final Context context, final SnapshotFileInfo inputInfo,<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        final Path outputPath) throws IOException {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      // Get the file information<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      FileStatus inputStat = getSourceFileStatus(context, inputInfo);<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>      // Verify if the output file exists and is the same that we want to copy<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      if (outputFs.exists(outputPath)) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        FileStatus outputStat = outputFs.getFileStatus(outputPath);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        if (outputStat != null &amp;&amp; sameFile(inputStat, outputStat)) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          LOG.info("Skip copy " + inputStat.getPath() + " to " + outputPath + ", same file.");<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          context.getCounter(Counter.FILES_SKIPPED).increment(1);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>          context.getCounter(Counter.BYTES_SKIPPED).increment(inputStat.getLen());<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          return;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      }<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      InputStream in = openSourceFile(context, inputInfo);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      int bandwidthMB = context.getConfiguration().getInt(CONF_BANDWIDTH_MB, 100);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      if (Integer.MAX_VALUE != bandwidthMB) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        in = new ThrottledInputStream(new BufferedInputStream(in), bandwidthMB * 1024 * 1024L);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>      try {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        context.getCounter(Counter.BYTES_EXPECTED).increment(inputStat.getLen());<a name="line.309"></a>
+<span class="sourceLineNo">310</span><a name="line.310"></a>
+<span class="sourceLineNo">311</span>        // Ensure that the output folder is there and copy the file<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        createOutputPath(outputPath.getParent());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        FSDataOutputStream out = outputFs.create(outputPath, true);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        try {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          copyData(context, inputStat.getPath(), in, outputPath, out, inputStat.getLen());<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        } finally {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          out.close();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>        // Try to Preserve attributes<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        if (!preserveAttributes(outputPath, inputStat)) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          LOG.warn("You may have to run manually chown on: " + outputPath);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      } finally {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        in.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>        injectTestFailure(context, inputInfo);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      }<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    /**<a name="line.330"></a>
+<span class="sourceLineNo">331</span>     * Create the output folder and optionally set ownership.<a name="line.331"></a>
+<span class="sourceLineNo">332</span>     */<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    private void createOutputPath(final Path path) throws IOException {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      if (filesUser == null &amp;&amp; filesGroup == null) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        outputFs.mkdirs(path);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      } else {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        Path parent = path.getParent();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        if (!outputFs.exists(parent) &amp;&amp; !parent.isRoot()) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          createOutputPath(parent);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        outputFs.mkdirs(path);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        if (filesUser != null || filesGroup != null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          // override the owner when non-null user/group is specified<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          outputFs.setOwner(path, filesUser, filesGroup);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        if (filesMode &gt; 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          outputFs.setPermission(path, new FsPermission(filesMode));<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        }<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><a name="line.351"></a>
+<span class="sourceLineNo">352</span>    /**<a name="line.352"></a>
+<span class="sourceLineNo">353</span>     * Try to Preserve the files attribute selected by the user copying them from the source file<a name="line.353"></a>
+<span class="sourceLineNo">354</span>     * This is only required when you are exporting as a different user than "hbase" or on a system<a name="line.354"></a>
+<span class="sourceLineNo">355</span>     * that doesn't have the "hbase" user.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>     *<a name="line.356"></a>
+<span class="sourceLineNo">357</span>     * This is not considered a blocking failure since the user can force a chmod with the user<a name="line.357"></a>
+<span class="sourceLineNo">358</span>     * that knows is available on the system.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>     */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    private boolean preserveAttributes(final Path path, final FileStatus refStat) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      FileStatus stat;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      try {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        stat = outputFs.getFileStatus(path);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      } catch (IOException e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        LOG.warn("Unable to get the status for file=" + path);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        return false;<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>      try {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        if (filesMode &gt; 0 &amp;&amp; stat.getPermission().toShort() != filesMode) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>          outputFs.setPermission(path, new FsPermission(filesMode));<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        } else if (refStat != null &amp;&amp; !stat.getPermission().equals(refStat.getPermission())) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          outputFs.setPermission(path, refStat.getPermission());<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      } catch (IOException e) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        LOG.warn("Unable to set the permission for file="+ stat.getPath() +": "+ e.getMessage());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        return false;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>      boolean hasRefStat = (refStat != null);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      String user = stringIsNotEmpty(filesUser) || !hasRefStat ? filesUser : refStat.getOwner();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      String group = stringIsNotEmpty(filesGroup) || !hasRefStat ? filesGroup : refStat.getGroup();<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (stringIsNotEmpty(user) || stringIsNotEmpty(group)) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        try {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          if (!(user.equals(stat.getOwner()) &amp;&amp; group.equals(stat.getGroup()))) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            outputFs.setOwner(path, user, group);<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        } catch (IOException e) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          LOG.warn("Unable to set the owner/group for file="+ stat.getPath() +": "+ e.getMessage());<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          LOG.warn("The user/group may not exist on the destination cluster: user=" +<a name="line.390"></a>
+<span class="sourceLineNo">391</span>                   user + " group=" + group);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          return false;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>      return true;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    private boolean stringIsNotEmpty(final String str) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      return str != null &amp;&amp; str.length() &gt; 0;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
+<span class="sourceLineNo">402</span><a name="line.402"></a>
+<span class="sourceLineNo">403</span>    private void copyData(final Context context,<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        final Path inputPath, final InputStream in,<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        final Path outputPath, final FSDataOutputStream out,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        final long inputFileSize)<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        throws IOException {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      final String statusMessage = "copied %s/" + StringUtils.humanReadableInt(inputFileSize) +<a name="line.408"></a>
+<span class="sourceLineNo">409</span>                                   " (%.1f%%)";<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>      try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        byte[] buffer = new byte[bufferSize];<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        long totalBytesWritten = 0;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        int reportBytes = 0;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        int bytesRead;<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>        long stime = System.currentTimeMillis();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        while ((bytesRead = in.read(buffer)) &gt; 0) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>          out.write(buffer, 0, bytesRead);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>          totalBytesWritten += bytesRead;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>          reportBytes += bytesRead;<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>          if (reportBytes &gt;= REPORT_SIZE) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>            context.getCounter(Counter.BYTES_COPIED).increment(reportBytes);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>            context.setStatus(String.format(statusMessage,<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                              StringUtils.humanReadableInt(totalBytesWritten),<a name="line.426"></a>
+<span class="sourceLineNo">427</span>                              (totalBytesWritten/(float)inputFileSize) * 100.0f) +<a name="line.427"></a>
+<span class="sourceLineNo">428</span>                              " from " + inputPath + " to " + outputPath);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>            reportBytes = 0;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>          }<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        long etime = System.currentTimeMillis();<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>        context.getCounter(Counter.BYTES_COPIED).increment(reportBytes);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        context.setStatus(String.format(statusMessage,<a name="line.435"></a>
+<span class="sourceLineNo">436</span>                          StringUtils.humanReadableInt(totalBytesWritten),<a name="line.436"></a>
+<span class="sourceLineNo">437</span>                          (totalBytesWritten/(float)inputFileSize) * 100.0f) +<a name="line.437"></a>
+<span class="sourceLineNo">438</span>                          " from " + inputPath + " to " + outputPath);<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>        // Verify that the written size match<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        if (totalBytesWritten != inputFileSize) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          String msg = "number of bytes copied not matching copied=" + totalBytesWritten +<a name="line.442"></a>
+<span class="sourceLineNo">443</span>                       " expected=" + inputFileSize + " for file=" + inputPath;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          throw new IOException(msg);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        }<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>        LOG.info("copy completed for input=" + inputPath + " output=" + outputPath);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        LOG.info("size=" + totalBytesWritten +<a name="line.448"></a>
+<span class="sourceLineNo">449</span>            " (" + StringUtils.humanReadableInt(totalBytesWritten) + ")" +<a name="line.449"></a>
+<span class="sourceLineNo">450</span>            " time=" + StringUtils.formatTimeDiff(etime, stime) +<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            String.format(" %.3fM/sec", (totalBytesWritten / ((etime - stime)/1000.0))/1048576.0));<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        context.getCounter(Counter.FILES_COPIED).increment(1);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      } catch (IOException e) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        LOG.error("Error copying " + inputPath + " to " + outputPath, e);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        context.getCounter(Counter.COPY_FAILED).increment(1);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        throw e;<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><a name="line.459"></a>
+<span class="sourceLineNo">460</span>    /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>     * Try to open the "source" file.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>     * Throws an IOException if the communication with the inputFs fail or<a name="line.462"></a>
+<span class="sourceLineNo">463</span>     * if the file is not found.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>     */<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    private FSDataInputStream openSourceFile(Context context, final SnapshotFileInfo fileInfo)<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            throws IOException {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      try {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        Configuration conf = context.getConfiguration();<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        FileLink link = null;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        switch (fileInfo.getType()) {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          case HFILE:<a name="line.471"></a>
+<span class="sourceLineNo">472</span>            Path inputPath = new Path(fileInfo.getHfile());<a name="line.472"></a>
+<span class="sourceLineNo">473</span>            link = getFileLink(inputPath, conf);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>            break;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>          case WAL:<a name="line.475"></a>
+<span class="sourceLineNo">476</span>            String serverName = fileInfo.getWalServer();<a name="line.476"></a>
+<span class="sourceLineNo">477</span>            String logName = fileInfo.getWalName();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>            link = new WALLink(inputRoot, serverName, logName);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>            break;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          default:<a name="line.480"></a>
+<span class="sourceLineNo">481</span>            throw new IOException("Invalid File Type: " + fileInfo.getType().toString());<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        }<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        return link.open(inputFs);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      } catch (IOException e) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>        context.getCounter(Counter.MISSING_FILES).increment(1);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        LOG.error("Unable to open source file=" + fileInfo.toString(), e);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        throw e;<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>    private FileStatus getSourceFileStatus(Context context, final SnapshotFileInfo fileInfo)<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        throws IOException {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      try {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>        Configuration conf = context.getConfiguration();<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        FileLink link = null;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        switch (fileInfo.getType()) {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>          case HFILE:<a name="line.497"></a>
+<span class="sourceLineNo">498</span>            Path inputPath = new Path(fileInfo.getHfile());<a name="line.498"></a>
+<span class="sourceLineNo">499</span>            link = getFileLink(inputPath, conf);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>            break;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>          case WAL:<a name="line.501"></a>
+<span class="sourceLineNo">502</span>            link = new WALLink(inputRoot, fileInfo.getWalServer(), fileInfo.getWalName());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>            break;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>          default:<a name="line.504"></a>
+<span class="sourceLineNo">505</span>            throw new IOException("Invalid File Type: " + fileInfo.getType().toString());<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        }<a name="line.506"></a>
+<span class="sourceLineNo">507</span>        return link.getFileStatus(inputFs);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      } catch (FileNotFoundException e) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        context.getCounter(Counter.MISSING_FILES).increment(1);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>        LOG.error("Unable to get the status for source file=" + fileInfo.toString(), e);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>        throw e;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      } catch (IOException e) {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        LOG.error("Unable to get the status for source file=" + fileInfo.toString(), e);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        throw e;<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      }<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    private FileLink getFileLink(Path path, Configuration conf) throws IOException{<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      String regionName = HFileLink.getReferencedRegionName(path.getName());<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      TableName tableName = HFileLink.getReferencedTableName(path.getName());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      if(MobUtils.getMobRegionInfo(tableName).getEncodedName().equals(regionName)) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        return HFileLink.buildFromHFileLinkPattern(MobUtils.getQualifiedMobRootDir(conf),<a name="line.522"></a>
+<span class="sourceLineNo">523</span>                HFileArchiveUtil.getArchivePath(conf), path);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      return HFileLink.buildFromHFileLinkPattern(inputRoot, inputArchive, path);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span><a name="line.527"></a>
+<span class="sourceLineNo">528</span>    private FileChecksum getFileChecksum(final FileSystem fs, final Path path) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      try {<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        return fs.getFileChecksum(path);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      } catch (IOException e) {<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        LOG.warn("Unable to get checksum for file=" + path, e);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>        return null;<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      }<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>    /**<a name="line.537"></a>
+<span class="sourceLineNo">538</span>     * Check if the two files are equal by looking at the file length,<a name="line.538"></a>
+<span class="sourceLineNo">539</span>     * and at the checksum (if user has specified the verifyChecksum flag).<a name="line.539"></a>
+<span class="sourceLineNo">540</span>     */<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    private boolean sameFile(final FileStatus inputStat, final FileStatus outputStat) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      // Not matching length<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      if (inputStat.getLen() != outputStat.getLen()) return false;<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>      // Mark files as equals, since user asked for no checksum verification<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      if (!verifyChecksum) return true;<a name="line.546"></a>
+<span class="sourceLineNo">547</span><a name="line.547"></a>
+<span class="sourceLineNo">548</span>      // If checksums are not available, files are not the same.<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      FileChecksum inChecksum = getFileChecksum(inputFs, inputStat.getPath());<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      if (inChecksum == null) return false;<a name="line.550"></a>
+<span class="sourceLineNo">551</span><a name="line.551"></a>
+<span class="sourceLineNo">552</span>      FileChecksum outChecksum = getFileChecksum(outputFs, outputStat.getPath());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      if (outChecksum == null) return false;<a name="line.553"></a>
+<span class="sourceLineNo">554</span><a name="line.554"></a>
+<span class="sourceLineNo">555</span>      return inChecksum.equals(outChecksum);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  }<a name="line.557"></a>
+<span class="sourceLineNo">558</span><a name="line.558"></a>
+<span class="sourceLineNo">559</span>  // ==========================================================================<a name="line.559"></a>
+<span class="sourceLineNo">560</span>  //  Input Format<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>   * Extract the list of files (HFiles/WALs) to copy using Map-Reduce.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   * @return list of files referenced by the snapshot (pair of path and size)<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   */<a name="line.566"></a>
+<span class="sourceLineNo">567</span>  private static List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; getSnapshotFiles(final Configuration conf,<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      final FileSystem fs, final Path snapshotDir) throws IOException {<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    SnapshotDescription snapshotDesc = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.569"></a>
+<span class="sourceLineNo">570</span><a name="line.570"></a>
+<span class="sourceLineNo">571</span>    final List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; files = new ArrayList&lt;&gt;();<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final TableName table = TableName.valueOf(snapshotDesc.getTable());<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>    // Get snapshot files<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    LOG.info("Loading Snapshot '" + snapshotDesc.getName() + "' hfile list");<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    SnapshotReferenceUtil.visitReferencedFiles(conf, fs, snapshotDir, snapshotDesc,<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      new SnapshotReferenceUtil.SnapshotVisitor() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>        @Override<a name="line.578"></a>
+<span class="sourceLineNo">579</span>        public void storeFile(final RegionInfo regionInfo, final String family,<a name="line.579"></a>
+<span class="sourceLineNo">580</span>            final SnapshotRegionManifest.StoreFile storeFile) throws IOException {<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          // for storeFile.hasReference() case, copied as part of the manifest<a name="line.581"></a>
+<span class="sourceLineNo">582</span>          if (!storeFile.hasReference()) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>            String region = regionInfo.getEncodedName();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>            String hfile = storeFile.getName();<a name="line.584"></a>
+<span class="sourceLineNo">585</span>            Path path = HFileLink.createPath(table, region, family, hfile);<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>            SnapshotFileInfo fileInfo = SnapshotFileInfo.newBuilder()<a name="line.587"></a>
+<span class="sourceLineNo">588</span>              .setType(SnapshotFileInfo.Type.HFILE)<a name="line.588"></a>
+<span class="sourceLineNo">589</span>              .setHfile(path.toString())<a name="line.589"></a>
+<span class="sourceLineNo">590</span>              .build();<a name="line.590"></a>
+<span class="sourceLineNo">591</span><a name="line.591"></a>
+<span class="sourceLineNo">592</span>            long size;<a name="line.592"></a>
+<span class="sourceLineNo">593</span>            if (storeFile.hasFileSize()) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>              size = storeFile.getFileSize();<a name="line.594"></a>
+<span class="sourceLineNo">595</span>            } else {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>              size = HFileLink.buildFromHFileLinkPattern(conf, path).getFileStatus(fs).getLen();<a name="line.596"></a>
+<span class="sourceLineNo">597</span>            }<a name="line.597"></a>
+<span class="sourceLineNo">598</span>            files.add(new Pair&lt;&gt;(fileInfo, size));<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          }<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<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>    return files;<a name="line.603"></a>
+<span class="sourceLineNo">604</span>  }<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>   * Given a list of file paths and sizes, create around ngroups in as balanced a way as possible.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>   * The groups created will have similar amounts of bytes.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>   * &lt;p&gt;<a name="line.609"></a>
+<span class="sourceLineNo">610</span>   * The algorithm used is pretty straightforward; the file list is sorted by size,<a name="line.610"></a>
+<span class="sourceLineNo">611</span>   * and then each group fetch the bigger file available, iterating through groups<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * alternating the direction.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>  static List&lt;List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;&gt; getBalancedSplits(<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      final List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; files, final int ngroups) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    // Sort files by size, from small to big<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Collections.sort(files, new Comparator&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;() {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      public int compare(Pair&lt;SnapshotFileInfo, Long&gt; a, Pair&lt;SnapshotFileInfo, Long&gt; b) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>        long r = a.getSecond() - b.getSecond();<a name="line.619"></a>
+<span class="sourceLineNo">620</span>        return (r &lt; 0) ? -1 : ((r &gt; 0) ? 1 : 0);<a name="line.620"></a>
+<span class="sourceLineNo">621</span>      }<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    });<a name="line.622"></a>
+<span class="sourceLineNo">623</span><a name="line.623"></a>
+<span class="sourceLineNo">624</span>    // create balanced groups<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    List&lt;List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;&gt; fileGroups = new LinkedList&lt;&gt;();<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    long[] sizeGroups = new long[ngroups];<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    int hi = files.size() - 1;<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    int lo = 0;<a name="line.628"></a>
+<span class="sourceLineNo">629</span><a name="line.629"></a>
+<span class="sourceLineNo">630</span>    List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; group;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    int dir = 1;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    int g = 0;<a name="line.632"></a>
+<span class="sourceLineNo">633</span><a name="line.633"></a>
+<span class="sourceLineNo">634</span>    while (hi &gt;= lo) {<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      if (g == fileGroups.size()) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>        group = new LinkedList&lt;&gt;();<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        fileGroups.add(group);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      } else {<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        group = fileGroups.get(g);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>      Pair&lt;SnapshotFileInfo, Long&gt; fileInfo = files.get(hi--);<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      // add the hi one<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      sizeGroups[g] += fileInfo.getSecond();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      group.add(fileInfo);<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>      // change direction when at the end or the beginning<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      g += dir;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      if (g == ngroups) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>        dir = -1;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>        g = ngroups - 1;<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      } else if (g &lt; 0) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        dir = 1;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        g = 0;<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>    if (LOG.isDebugEnabled()) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      for (int i = 0; i &lt; sizeGroups.length; ++i) {<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        LOG.debug("export split=" + i + " size=" + StringUtils.humanReadableInt(sizeGroups[i]));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    }<a name="line.663"></a>
+<span class="sourceLineNo">664</span><a name="line.664"></a>
+<span class="sourceLineNo">665</span>    return fileGroups;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>  private static class ExportSnapshotInputFormat extends InputFormat&lt;BytesWritable, NullWritable&gt; {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    @Override<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    public RecordReader&lt;BytesWritable, NullWritable&gt; createRecordReader(InputSplit split,<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        TaskAttemptContext tac) throws IOException, InterruptedException {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      return new ExportSnapshotRecordReader(((ExportSnapshotInputSplit)split).getSplitKeys());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    @Override<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    public List&lt;InputSplit&gt; getSplits(JobContext context) throws IOException, InterruptedException {<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      Configuration conf = context.getConfiguration();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Path snapshotDir = new Path(conf.get(CONF_SNAPSHOT_DIR));<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      FileSystem fs = FileSystem.get(snapshotDir.toUri(), conf);<a name="line.679"></a>
+<span class="sourceLineNo">680</span><a name="line.680"></a>
+<span class="sourceLineNo">681</span>      List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; snapshotFiles = getSnapshotFiles(conf, fs, snapshotDir);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      int mappers = conf.getInt(CONF_NUM_SPLITS, 0);<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      if (mappers == 0 &amp;&amp; snapshotFiles.size() &gt; 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        mappers = 1 + (snapshotFiles.size() / conf.getInt(CONF_MAP_GROUP, 10));<a name="line.684"></a>
+<span class="sourceLineNo">685</span>        mappers = Math.min(mappers, snapshotFiles.size());<a name="line.685"></a>
+<span class="sourceLineNo">686</span>        conf.setInt(CONF_NUM_SPLITS, mappers);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>        conf.setInt(MR_NUM_MAPS, mappers);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>      List&lt;List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt;&gt; groups = getBalancedSplits(snapshotFiles, mappers);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      List&lt;InputSplit&gt; splits = new ArrayList(groups.size());<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      for (List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; files: groups) {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>        splits.add(new ExportSnapshotInputSplit(files));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      return splits;<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    }<a name="line.696"></a>
+<span class="sourceLineNo">697</span><a name="line.697"></a>
+<span class="sourceLineNo">698</span>    private static class ExportSnapshotInputSplit extends InputSplit implements Writable {<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      private List&lt;Pair&lt;BytesWritable, Long&gt;&gt; files;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>      private long length;<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>      public ExportSnapshotInputSplit() {<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        this.files = null;<a name="line.703"></a>
+<span class="sourceLineNo">704</span>      }<a name="line.704"></a>
+<span class="sourceLineNo">705</span><a name="line.705"></a>
+<span class="sourceLineNo">706</span>      public ExportSnapshotInputSplit(final List&lt;Pair&lt;SnapshotFileInfo, Long&gt;&gt; snapshotFiles) {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        this.files = new ArrayList(snapshotFiles.size());<a name="line.707"></a>
+<span class="sourceLineNo">708</span>        for (Pair&lt;SnapshotFileInfo, Long&gt; fileInfo: snapshotFiles) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>          this.files.add(new Pair&lt;&gt;(<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            new BytesWritable(fileInfo.getFirst().toByteArray()), fileInfo.getSecond()));<a name="line.710"></a>
+<span class="sourceLineNo">711</span>          this.length += fileInfo.getSecond();<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        }<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>      private List&lt;Pair&lt;BytesWritable, Long&gt;&gt; getSplitKeys() {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>        return files;<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      @Override<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      public long getLength() throws IOException, InterruptedException {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>        return length;<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      }<a name="line.722"></a>
+<span class="sourceLineNo">723</span><a name="line.723"></a>
+<span class="sourceLineNo">724</span>      @Override<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      public String[] getLocations() throws IOException, InterruptedException {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        return new String[] {};<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>      @Override<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      public void readFields(DataInput in) throws IOException {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        int count = in.readInt();<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        files = new ArrayList&lt;&gt;(count);<a name="line.732"></a>
+<span class="sourceLineNo">733</span>        length = 0;<a name="line.733"></a>
+<span class="sourceLineNo">734</span>        for (int i = 0; i &lt; count; ++i) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>          BytesWritable fileInfo = new BytesWritable();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>          fileInfo.readFields(in);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>          long size = in.readLong();<a name="line.737"></a>
+<span class="sourceLineNo">738</span>          files.add(new Pair&lt;&gt;(fileInfo, size));<a name="line.738"></a>
+<span class="sourceLineNo">739</span>          length += size;<a name="line.739"></a>
+<span class="sourceLineNo">740</span>        }<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>      @Override<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      public void write(DataOutput out) throws IOException {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>        out.writeInt(files.size());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>        for (final Pair&lt;BytesWritable, Long&gt; fileInfo: files) {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>          fileInfo.getFirst().write(out);<a name="line.747"></a>
+<span class="sourceLineNo">748</span>          out.writeLong(fileInfo.getSecond());<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>    }<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    private static class ExportSnapshotRecordReader<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        extends RecordReader&lt;BytesWritable, NullWritable&gt; {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      private final List&lt;Pair&lt;BytesWritable, Long&gt;&gt; files;<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      private long totalSize = 0;<a name="line.756"></a>
+<span class="sourceLineNo">757</span>      private long procSize = 0;<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      private int index = -1;<a name="line.758"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>      ExportSnapshotRecordReader(final List&lt;Pair&lt;BytesWritable, Long&gt;&gt; files) {<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        this.files = files;<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        for (Pair&lt;BytesWritable, Long&gt; fileInfo: files) {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>          totalSize += fileInfo.getSecond();<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>      @Override<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      public void close() { }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>      @Override<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      public BytesWritable getCurrentKey() { return files.get(index).getFirst(); }<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>      @Override<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      public NullWritable getCurrentValue() { return NullWritable.get(); }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>      @Override<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      public float getProgress() { return (float)procSize / totalSize; }<a name="line.777"></a>
+<span class="sourceLineNo">778</span><a name="line.778"></a>
+<span class="sourceLineNo">779</span>      @Override<a name="line.779"></a>
+<span class="sourceLineNo">780</span>      public void initialize(InputSplit split, TaskAttemptContext tac) { }<a name="line.780"></a>
+<span class="sourceLineNo">781</span><a name="line.781"></a>
+<span class="sourceLineNo">782</span>      @Override<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      public boolean nextKeyValue() {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>        if (index &gt;= 0) {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>          procSize += files.get(index).getSecond();<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        }<a name="line.786"></a>
+<span class="sourceLineNo">787</span>        return(++index &lt; files.size());<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      }<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  // ==========================================================================<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  //  Tool<a name="line.793"></a>
+<span class="sourceLineNo">794</span>  // ==========================================================================<a name="line.794"></a>
+<span class="sourceLineNo">795</span><a name="line.795"></a>
+<span class="sourceLineNo">796</span>  /**<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   * Run Map-Reduce Job to perform the files copy.<a name="line.797"></a>
+<span class="sourceLineNo">798</span>   */<a name="line.798"></a>
+<span class="sourceLineNo">799</span>  private void runCopyJob(final Path inputRoot, final Path outputRoot,<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      final String snapshotName, final Path snapshotDir, final boolean verifyChecksum,<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      final String filesUser, final String filesGroup, final int filesMode,<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      final int mappers, final int bandwidthMB)<a name="line.802"></a>
+<span class="sourceLineNo">803</span>          throws IOException, InterruptedException, ClassNotFoundException {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    Configuration conf = getConf();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    if (filesGroup != null) conf.set(CONF_FILES_GROUP, filesGroup);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    if (filesUser != null) conf.set(CONF_FILES_USER, filesUser);<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    if (mappers &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>      conf.setInt(CONF_NUM_SPLITS, mappers);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>      conf.setInt(MR_NUM_MAPS, mappers);<a name="line.809"></a>
+<span class="sourceLineNo">810</span>    }<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    conf.setInt(CONF_FILES_MODE, filesMode);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    conf.setBoolean(CONF_CHECKSUM_VERIFY, verifyChecksum);<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    conf.set(CONF_OUTPUT_ROOT, outputRoot.toString());<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    conf.set(CONF_INPUT_ROOT, inputRoot.toString());<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    conf.setInt(CONF_BANDWIDTH_MB, bandwidthMB);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    conf.set(CONF_SNAPSHOT_NAME, snapshotName);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    conf.set(CONF_SNAPSHOT_DIR, snapshotDir.toString());<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>    String jobname = conf.get(CONF_MR_JOB_NAME, "ExportSnapshot-" + snapshotName);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    Job job = new Job(conf);<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    job.setJobName(jobname);<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    job.setJarByClass(ExportSnapshot.class);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    job.setMapperClass(ExportMapper.class);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>    job.setInputFormatClass(ExportSnapshotInputFormat.class);<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    job.setOutputFormatClass(NullOutputFormat.class);<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    job.setMapSpeculativeExecution(false);<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    job.setNumReduceTasks(0);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>    // Acquire the delegation Tokens<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    Configuration srcConf = HBaseConfiguration.createClusterConf(conf, null, CONF_SOURCE_PREFIX);<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    TokenCache.obtainTokensForNamenodes(job.getCredentials(),<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      new Path[] { inputRoot }, srcConf);<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    Configuration destConf = HBaseConfiguration.createClusterConf(conf, null, CONF_DEST_PREFIX);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    TokenCache.obtainTokensForNamenodes(job.getCredentials(),<a name="line.835"></a>
+<span class="sourceLineNo">836</span>        new Path[] { outputRoot }, destConf);<a name="line.836"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span>    // Run the MR Job<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    if (!job.waitForCompletion(true)) {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      throw new ExportSnapshotException(job.getStatus().getFailureInfo());<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
+<span class="sourceLineNo">842</span>  }<a name="line.842"></a>
+<span class="sourceLineNo">843</span><a name="line.843"></a>
+<span class="sourceLineNo">844</span>  private void verifySnapshot(final Configuration baseConf,<a name="line.844"></a>
+<span class="sourceLineNo">845</span>      final FileSystem fs, final Path rootDir, final Path snapshotDir) throws IOException {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    // Update the conf with the current root dir, since may be a different cluster<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    Configuration conf = new Configuration(baseConf);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    FSUtils.setRootDir(conf, rootDir);<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    FSUtils.setFsDefault(conf, FSUtils.getRootDir(conf));<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    SnapshotDescription snapshotDesc = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    SnapshotReferenceUtil.verifySnapshot(conf, fs, snapshotDir, snapshotDesc);<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>  private void setConfigParallel(FileSystem outputFs, List&lt;Path&gt; traversedPath,<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      BiConsumer&lt;FileSystem, Path&gt; task, Configuration conf) throws IOException {<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    ExecutorService pool = Executors<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        .newFixedThreadPool(conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    List&lt;Future&lt;Void&gt;&gt; futures = new ArrayList&lt;&gt;();<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    for (Path dstPath : traversedPath) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      Future&lt;Void&gt; future = (Future&lt;Void&gt;) pool.submit(() -&gt; task.accept(outputFs, dstPath));<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      futures.add(future);<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    }<a name="line.862"></a>
+<span class="sourceLineNo">863</span>    try {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      for (Future&lt;Void&gt; future : futures) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>        future.get();<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>    } catch (InterruptedException | ExecutionException e) {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      throw new IOException(e);<a name="line.868"></a>
+<span class="sourceLineNo">869</span>    } finally {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      pool.shutdownNow();<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    }<a name="line.871"></a>
+<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>  private void setOwnerParallel(FileSystem outputFs, String filesUser, String filesGroup,<a name="line.874"></a>
+<span class="sourceLineNo">875</span>      Configuration conf, List&lt;Path&gt; traversedPath) throws IOException {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    setConfigParallel(outputFs, traversedPath, (fs, path) -&gt; {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      try {<a name="line.877"></a>
+<span class="sourceLineNo">878</span>        fs.setOwner(path, filesUser, filesGroup);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>      } catch (IOException e) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>        throw new RuntimeException(<a name="line.880"></a>
+<span class="sourceLineNo">881</span>            "set owner for file " + path + " to " + filesUser + ":" + filesGroup + " failed", e);<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      }<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    }, conf);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>  }<a name="line.884"></a>
+<span class="sourceLineNo">885</span><a name="line.885"></a>
+<span class="sourceLineNo">886</span>  private void setPermissionParallel(final FileSystem outputFs, final short filesMode,<a name="line.886"></a>
+<span class="sourceLineNo">887</span>      final List&lt;Path&gt; traversedPath, final Configuration conf) throws IOException {<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    if (filesMode &lt;= 0) {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>      return;<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    }<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    FsPermission perm = new FsPermission(filesMode);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    setConfigParallel(outputFs, traversedPath, (fs, path) -&gt; {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        fs.setPermission(path, perm);<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      } catch (IOException e) {<a name="line.895"></a>
+<span class="sourceLineNo">896</span>        throw new RuntimeException(<a name="line.896"></a>
+<span class="sourceLineNo">897</span>            "set permission for file " + path + " to " + filesMode + " failed", e);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      }<a name="line.898"></a>
+<span class="sourceLineNo">899</span>    }, conf);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>  }<a name="line.900"></a>
+<span class="sourceLineNo">901</span><a name="line.901"></a>
+<span class="sourceLineNo">902</span>  private boolean verifyTarget = true;<a name="line.902"></a>
+<span class="sourceLineNo">903</span>  private boolean verifyChecksum = true;<a name="line.903"></a>
+<span class="sourceLineNo">904</span>  private String snapshotName = null;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  private String targetName = null;<a name="line.905"></a>
+<span class="sourceLineNo">906</span>  private boolean overwrite = false;<a name="line.906"></a>
+<span class="sourceLineNo">907</span>  private String filesGroup = null;<a name="line.907"></a>
+<span class="sourceLineNo">908</span>  private String filesUser = null;<a name="line.908"></a>
+<span class="sourceLineNo">909</span>  private Path outputRoot = null;<a name="line.909"></a>
+<span class="sourceLineNo">910</span>  private Path inputRoot = null;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>  private int bandwidthMB = Integer.MAX_VALUE;<a name="line.911"></a>
+<span class="sourceLineNo">912</span>  private int filesMode = 0;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>  private int mappers = 0;<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>  @Override<a name="line.915"></a>
+<span class="sourceLineNo">916</span>  protected void processOptions(CommandLine cmd) {<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    snapshotName = cmd.getOptionValue(Options.SNAPSHOT.getLongOpt(), snapshotName);<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    targetName = cmd.getOptionValue(Options.TARGET_NAME.getLongOpt(), targetName);<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    if (cmd.hasOption(Options.COPY_TO.getLongOpt())) {<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      outputRoot = new Path(cmd.getOptionValue(Options.COPY_TO.getLongOpt()));<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    if (cmd.hasOption(Options.COPY_FROM.getLongOpt())) {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      inputRoot = new Path(cmd.getOptionValue(Options.COPY_FROM.getLongOpt()));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    mappers = getOptionAsInt(cmd, Options.MAPPERS.getLongOpt(), mappers);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>    filesUser = cmd.getOptionValue(Options.CHUSER.getLongOpt(), filesUser);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    filesGroup = cmd.getOptionValue(Options.CHGROUP.getLongOpt(), filesGroup);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    filesMode = getOptionAsInt(cmd, Options.CHMOD.getLongOpt(), filesMode);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    bandwidthMB = getOptionAsInt(cmd, Options.BANDWIDTH.getLongOpt(), bandwidthMB);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    overwrite = cmd.hasOption(Options.OVERWRITE.getLongOpt());<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    // And verifyChecksum and verifyTarget with values read from old args in processOldArgs(...).<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    verifyChecksum = !cmd.hasOption(Options.NO_CHECKSUM_VERIFY.getLongOpt());<a name="line.932"></a>
+<span class="sourceLineNo">933</span>    verifyTarget = !cmd.hasOption(Options.NO_TARGET_VERIFY.getLongOpt());<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>
+<span class="sourceLineNo">937</span>   * Execute the export snapshot by copying the snapshot metadata, hfiles and wals.<a name="line.937"></a>
+<span class="sourceLineNo">938</span>   * @return 0 on success, and != 0 upon failure.<a name="line.938"></a>
+<span class="sourceLineNo">939</span>   */<a name="line.939"></a>
+<span class="sourceLineNo">940</span>  @Override<a name="line.940"></a>
+<span class="sourceLineNo">941</span>  public int doWork() throws IOException {<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    Configuration conf = getConf();<a name="line.942"></a>
+<span class="sourceLineNo">943</span><a name="line.943"></a>
+<span class="sourceLineNo">944</span>    // Check user options<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    if (snapshotName == null) {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>      System.err.println("Snapshot name not provided.");<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      LOG.error("Use -h or --help for usage instructions.");<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      return 0;<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>    if (outputRoot == null) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      System.err.println("Destination file-system (--" + Options.COPY_TO.getLongOpt()<a name="line.952"></a>
+<span class="sourceLineNo">953</span>              + ") not provided.");<a name="line.953"></a>
+<span class="sourceLineNo">954</span>      LOG.error("Use -h or --help for usage instructions.");<a name="line.954"></a>
+<span class="sourceLineNo">955</span>      return 0;<a name="line.955"></a>
+<span class="sourceLineNo">956</span>    }<a name="line.956"></a>
+<span class="sourceLineNo">957</span><a name="line.957"></a>
+<span class="sourceLineNo">958</span>    if (targetName == null) {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      targetName = snapshotName;<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    }<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    if (inputRoot == null) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      inputRoot = FSUtils.getRootDir(conf);<a name="line.962"></a>
+<span class="sourceLineNo">963</span>    } else {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      FSUtils.setRootDir(conf, inputRoot);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>    Configuration srcConf = HBaseConfiguration.createClusterConf(conf, null, CONF_SOURCE_PREFIX);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>    srcConf.setBoolean("fs." + inputRoot.toUri().getScheme() + ".impl.disable.cache", true);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>    FileSystem inputFs = FileSystem.get(inputRoot.toUri(), srcConf);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>    LOG.debug("inputFs=" + inputFs.getUri().toString() + " inputRoot=" + inputRoot);<a name="line.970"></a>
+<span class="sourceLineNo">971</span>    Configuration destConf = HBaseConfiguration.createClusterConf(conf, null, CONF_DEST_PREFIX);<a name="line.971"></a>
+<span class="sourceLineNo">972</span>    destConf.setBoolean("fs." + outputRoot.toUri().getScheme() + ".impl.disable.cache", true);<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    FileSystem outputFs = FileSystem.get(outputRoot.toUri(), destConf);<a name="line.973"></a>
+<span class="sourceLineNo">974</span>    LOG.debug("outputFs=" + outputFs.getUri().toString() + " outputRoot=" + outputRoot.toString());<a name="line.974"></a>
+<span class="sourceLineNo">975</span><a name="line.975"></a>
+<span class="sourceLineNo">976</span>    boolean skipTmp = conf.getBoolean(CONF_SKIP_TMP, false) ||<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        conf.get(SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR) != null;<a name="line.977"></a>
+<span class="sourceLineNo">978</span><a name="line.978"></a>
+<span class="sourceLineNo">979</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot,<a name="line.980"></a>
+<span class="sourceLineNo">981</span>        destConf);<a name="line.981"></a>
+<span class="sourceLineNo">982</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    // Find the necessary directory which need to change owner and group<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>      if (skipTmp) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      } else {<a name="line.990"></a>
+<span class="sourceLineNo">991</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot, destConf);<a name="line.991"></a>
+<span class="sourceLineNo">992</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>          needSetOwnerDir = snapshotTmpDir;<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>    // Check if the snapshot already exists<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>      if (overwrite) {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>          return 1;<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>        }<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>      } else {<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>        System.err.println("The snapshot '" + targetName +<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>        return 1;<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      }<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    }<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span><a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    if (!skipTmp) {<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      // Check if the snapshot already in-progress<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>        if (overwrite) {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>            return 1;<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>          }<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        } else {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>          return 1;<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>        }<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      }<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    }<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span><a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    // will remove them because they are unreferenced.<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    boolean copySucceeded = false;<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      travesedPaths =<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      copySucceeded = true;<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    } catch (IOException e) {<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    } finally {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      if (copySucceeded) {<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>        if (filesUser != null || filesGroup != null) {<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>              + filesUser)<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>                  + filesGroup));<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>        }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        if (filesMode &gt; 0) {<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>        }<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">1058</span><a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    if (!targetName.equals(snapshotName)) {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>      SnapshotDescription snapshotDesc =<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>          .toBuilder()<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>          .setName(targetName)<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>          .build();<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      if (filesUser != null || filesGroup != null) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>      if (filesMode &gt; 0) {<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>      }<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span><a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    // Step 2 - Start MR Job to copy files<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    // by the HFileArchiver, since they have no references.<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>    try {<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span><a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>      if (!skipTmp) {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>      // Step 4 - Verify snapshot integrity<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (verifyTarget) {<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>        LOG.info("Verify snapshot integrity");<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span><a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      LOG.info("Export Completed: " + targetName);<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      return 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    } catch (Exception e) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>      LOG.error("Snapshot export failed", e);<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      if (!skipTmp) {<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>      }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      return 1;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    } finally {<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      IOUtils.closeStream(inputFs);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>      IOUtils.closeStream(outputFs);<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  }<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span><a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>  @Override<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>  protected void printUsage() {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    super.printUsage();<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    System.out.println("\n"<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>        + "Examples:\n"<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>        + "  hbase snapshot export \\\n"<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>        + "\n"<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>        + "  hbase snapshot export \\\n"<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>  }<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span><a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>  @Override protected void addOptions() {<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    addOption(Options.COPY_TO);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>    addOption(Options.COPY_FROM);<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>    addOption(Options.TARGET_NAME);<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    addOption(Options.OVERWRITE);<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>    addOption(Options.CHUSER);<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    addOption(Options.CHGROUP);<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    addOption(Options.CHMOD);<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>    addOption(Options.MAPPERS);<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    addOption(Options.BANDWIDTH);<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>  }<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span><a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>  public static void main(String[] args) {<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>}<a name="line.1146"></a>
 
 
 
diff --git a/book.html b/book.html
index 59bb4b9..6e5999d 100644
--- a/book.html
+++ b/book.html
@@ -42882,7 +42882,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-08-10 14:29:42 UTC
+Last updated 2019-08-12 14:29:47 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index b1a1963..02c5de1 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -155,7 +155,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-12</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 d5d4f7d..29f4b10 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -152,7 +152,7 @@
 <td>3937</td>
 <td>0</td>
 <td>0</td>
-<td>11760</td></tr></table></div>
+<td>11742</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -295,7 +295,7 @@
 <td><a href="#org.apache.hadoop.hbase.HBaseTestingUtility.java">org/apache/hadoop/hbase/HBaseTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>215</td></tr>
+<td>204</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.HColumnDescriptor.java">org/apache/hadoop/hbase/HColumnDescriptor.java</a></td>
 <td>0</td>
@@ -1060,7 +1060,7 @@
 <td><a href="#org.apache.hadoop.hbase.client.SimpleRequestController.java">org/apache/hadoop/hbase/client/SimpleRequestController.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>9</td></tr>
+<td>7</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.client.SimpleScanResultConsumer.java">org/apache/hadoop/hbase/client/SimpleScanResultConsumer.java</a></td>
 <td>0</td>
@@ -1075,7 +1075,7 @@
 <td><a href="#org.apache.hadoop.hbase.client.Table.java">org/apache/hadoop/hbase/client/Table.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>12</td></tr>
+<td>10</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.client.TableDescriptor.java">org/apache/hadoop/hbase/client/TableDescriptor.java</a></td>
 <td>0</td>
@@ -3660,7 +3660,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.MockRegionServer.java">org/apache/hadoop/hbase/master/MockRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>10</td></tr>
+<td>7</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.RackManager.java">org/apache/hadoop/hbase/master/RackManager.java</a></td>
 <td>0</td>
@@ -8271,12 +8271,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>642</td>
+<td>640</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>2946</td>
+<td>2930</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -10443,54 +10443,6 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2042</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2043</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2044</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2045</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2046</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2047</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2048</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2049</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
 <td>2068</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -10695,19 +10647,7 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3296</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3297</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3298</td></tr>
+<td>3310</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -10716,22 +10656,22 @@
 <td>3311</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3312</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3315</td></tr>
-<tr class="b">
+<td>3314</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3320</td></tr>
+<td>3319</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>3327</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -10743,7 +10683,7 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3329</td></tr>
+<td>3344</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -10755,31 +10695,31 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3346</td></tr>
+<td>3357</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3358</td></tr>
+<td>3378</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3379</td></tr>
+<td>3410</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3411</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3415</td></tr>
+<td>3414</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>3466</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -10809,7 +10749,7 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3471</td></tr>
+<td>3510</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -10821,365 +10761,359 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3512</td></tr>
+<td>3536</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3537</td></tr>
+<td>3545</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3546</td></tr>
+<td>3558</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3559</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>3579</td></tr>
-<tr class="b">
+<td>3578</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>3610</td></tr>
-<tr class="a">
+<td>3609</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3669</td></tr>
-<tr class="b">
+<td>3668</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3670</td></tr>
-<tr class="a">
+<td>3669</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rparen' has incorrect indentation level 48, expected level should be 2.</td>
-<td>3690</td></tr>
-<tr class="b">
+<td>3689</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>3708</td></tr>
-<tr class="a">
+<td>3707</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>3999</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>4086</td></tr>
+<td>3998</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>4088</td></tr>
+<td>4085</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>4122</td></tr>
+<td>4087</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>4163</td></tr>
+<td>4121</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>4165</td></tr>
+<td>4162</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>4243</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>4164</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4251</td></tr>
+<td>4242</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4259</td></tr>
+<td>4250</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4260</td></tr></table></div>
+<td>4258</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>4259</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HColumnDescriptor.java">org/apache/hadoop/hbase/HColumnDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.ColumnFamilyDescriptor' import.</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>42</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>47</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 119).</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
 <td>83</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>87</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>91</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 122).</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>96</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 122).</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>98</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 126).</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>109</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>124</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>162</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>308</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>353</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>391</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>421</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>476</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>491</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>589</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>673</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -11188,97 +11122,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HFilePerformanceEvaluation.java">org/apache/hadoop/hbase/HFilePerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.ImmutableBytesWritable' import.</td>
 <td>33</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.CacheConfig' import.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>104</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>171</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>172</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>173</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>191</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>192</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>193</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>548</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -11287,361 +11221,361 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HRegionInfo.java">org/apache/hadoop/hbase/HRegionInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>109</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>129</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>234</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>245</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>261</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>263</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>278</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>281</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>336</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>354</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>375</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>392</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>409</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>412</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>439</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>451</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>453</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>460</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>466</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>468</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>602</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>649</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>766</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>796</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>803</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>809</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>812</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>816</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>827</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>832</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>833</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>842</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>869</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>882</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>886</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>898</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>899</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>913</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>914</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>928</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>929</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>943</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>944</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>959</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>961</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>978</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>993</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1036</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1037</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -11650,13 +11584,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HRegionLocation.java">org/apache/hadoop/hbase/HRegionLocation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -11665,211 +11599,211 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HTableDescriptor.java">org/apache/hadoop/hbase/HTableDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>68</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>77</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>78</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>143</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>205</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>215</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>225</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>248</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>414</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>430</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>532</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>542</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
 <td>553</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>603</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>729</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>747</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>777</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>791</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>795</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>799</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>817</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>859</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>860</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>908</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>909</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>913</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 20, expected level should be 14.</td>
 <td>935</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>935</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'lambda arguments' has incorrect indentation level 20, expected level should be 14.</td>
 <td>936</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -11878,19 +11812,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HTestConst.java">org/apache/hadoop/hbase/HTestConst.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.Collections' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -11899,97 +11833,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HealthChecker.java">org/apache/hadoop/hbase/HealthChecker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>118</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>119</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>122</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>123</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -11998,61 +11932,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IndividualBytesFieldCell.java">org/apache/hadoop/hbase/IndividualBytesFieldCell.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>122</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
 <td>156</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
 <td>160</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -12061,13 +11995,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestBackupRestore.java">org/apache/hadoop/hbase/IntegrationTestBackupRestore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -12076,319 +12010,319 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestDDLMasterFailover.java">org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>396</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>419</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>506</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>667</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 16, expected level should be one of the following: 10, 43, 44.</td>
 <td>705</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>705</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>720</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>780</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>854</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>855</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>856</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>857</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>858</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>859</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>860</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>861</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>862</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>863</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be 14.</td>
 <td>866</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 16.</td>
 <td>867</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be 14.</td>
 <td>868</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>869</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>870</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>871</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>872</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>873</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>874</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>875</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>876</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>877</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>878</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>879</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be 14.</td>
 <td>881</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 16.</td>
 <td>882</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be 14.</td>
 <td>883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>884</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>885</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>886</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>887</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>888</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be 14.</td>
 <td>890</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be 16.</td>
 <td>891</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be 14.</td>
 <td>892</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>893</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>894</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>895</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>896</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>897</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>898</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 12, expected level should be 14.</td>
 <td>899</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>919</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -12397,67 +12331,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngest.java">org/apache/hadoop/hbase/IntegrationTestIngest.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>71</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>75</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 7, expected level should be 6.</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 9, expected level should be 8.</td>
 <td>145</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -12466,25 +12400,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithACL.java">org/apache/hadoop/hbase/IntegrationTestIngestWithACL.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -12493,13 +12427,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithEncryption.java">org/apache/hadoop/hbase/IntegrationTestIngestWithEncryption.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -12508,37 +12442,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithMOB.java">org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>61</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -12547,25 +12481,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestIngestWithVisibilityLabels.java">org/apache/hadoop/hbase/IntegrationTestIngestWithVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 43.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
 <td>42</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -12574,19 +12508,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestManyRegions.java">org/apache/hadoop/hbase/IntegrationTestManyRegions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12595,19 +12529,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestMetaReplicas.java">org/apache/hadoop/hbase/IntegrationTestMetaReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -12616,43 +12550,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestRegionReplicaPerf.java">org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>72</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>294</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
@@ -12661,37 +12595,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.IntegrationTestingUtility.java">org/apache/hadoop/hbase/IntegrationTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>70</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>110</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -12700,709 +12634,709 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.KeyValue.java">org/apache/hadoop/hbase/KeyValue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
 <td>107</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>369</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>378</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>429</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>444</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>480</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>499</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>516</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>537</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>549</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>550</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>551</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>552</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>553</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>554</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>555</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>556</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>557</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>558</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>559</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>575</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>610</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>619</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>620</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>624</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
 <td>625</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>646</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>662</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>663</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>664</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>665</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>666</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>667</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>668</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>669</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>670</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>671</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>672</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>673</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>674</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>675</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>676</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>702</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>723</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>724</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>760</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>761</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>762</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>763</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>764</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>765</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>880</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1106</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1566</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1568</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1587</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1588</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 121).</td>
 <td>1609</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1747</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1748</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1758</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1759</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1760</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1761</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1762</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1763</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1859</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1860</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1870</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1871</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1872</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1873</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1874</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1875</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>1901</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1918</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1919</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1920</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1921</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1922</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1923</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1924</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2065</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2066</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2104</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2115</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2116</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2162</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2241</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2243</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2244</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2252</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2253</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>2255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2256</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2261</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2273</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2274</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2276</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2292</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2293</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2294</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2296</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2413</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2414</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -13411,55 +13345,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.KeyValueTestUtil.java">org/apache/hadoop/hbase/KeyValueTestUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 3 should be on the previous line.</td>
 <td>52</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -13468,169 +13402,169 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.KeyValueUtil.java">org/apache/hadoop/hbase/KeyValueUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>105</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>210</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>211</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>212</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>249</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>403</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>434</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>470</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>485</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>499</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>500</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>502</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>699</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>722</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>731</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>740</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>741</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>742</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>761</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>770</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>771</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>774</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -13639,199 +13573,199 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.LocalHBaseCluster.java">org/apache/hadoop/hbase/LocalHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.concurrent.CopyOnWriteArrayList' import.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>63</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>81</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>93</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>101</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>104</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>108</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>114</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>128</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>223</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>246</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>262</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>263</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>269</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>270</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>341</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>342</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>431</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>437</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -13840,31 +13774,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MetaMockingUtil.java">org/apache/hadoop/hbase/MetaMockingUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>53</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -13873,13 +13807,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MetaMutationAnnotation.java">org/apache/hadoop/hbase/MetaMutationAnnotation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -13888,283 +13822,283 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MetaTableAccessor.java">org/apache/hadoop/hbase/MetaTableAccessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>237</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>252</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>463</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>498</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>508</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>539</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>540</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>541</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>542</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>543</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>544</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>545</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>546</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>547</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>548</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>563</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>564</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>565</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>566</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>567</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>568</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>569</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>571</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>572</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>573</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>574</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>575</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>589</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>657</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>794</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>796</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>797</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>971</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>976</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>994</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1013</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1017</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1019</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1027</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1035</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1093</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1172</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -14173,151 +14107,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MiniHBaseCluster.java">org/apache/hadoop/hbase/MiniHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>62</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>65</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>74</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>231</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>399</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>478</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>479</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>480</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>495</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>578</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>579</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>580</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>595</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>608</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>614</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
... 93150 lines suppressed ...