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

[01/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 8ea88a7b6 -> 705d69c41


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.RegionData.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.RegionData.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.RegionData.html
index 110e99c..d115ecb 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.RegionData.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.RegionData.html
@@ -515,7 +515,7 @@
 <span class="sourceLineNo">507</span>        this.htd = htd;<a name="line.507"></a>
 <span class="sourceLineNo">508</span>        this.desc = desc;<a name="line.508"></a>
 <span class="sourceLineNo">509</span>        this.tableRegions = tableRegions;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.510"></a>
+<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.510"></a>
 <span class="sourceLineNo">511</span>        new FSTableDescriptors(conf)<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          .createTableDescriptorForTableDirectory(snapshotDir, htd, false);<a name="line.512"></a>
 <span class="sourceLineNo">513</span>      }<a name="line.513"></a>
@@ -695,7 +695,7 @@
 <span class="sourceLineNo">687</span>        .setVersion(version)<a name="line.687"></a>
 <span class="sourceLineNo">688</span>        .build();<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.690"></a>
+<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.690"></a>
 <span class="sourceLineNo">691</span>      SnapshotDescriptionUtils.writeSnapshotInfo(desc, workingDir, fs);<a name="line.691"></a>
 <span class="sourceLineNo">692</span>      return new SnapshotBuilder(conf, fs, rootDir, htd, desc, regions);<a name="line.692"></a>
 <span class="sourceLineNo">693</span>    }<a name="line.693"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.SnapshotBuilder.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.SnapshotBuilder.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.SnapshotBuilder.html
index 110e99c..d115ecb 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.SnapshotBuilder.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.SnapshotBuilder.html
@@ -515,7 +515,7 @@
 <span class="sourceLineNo">507</span>        this.htd = htd;<a name="line.507"></a>
 <span class="sourceLineNo">508</span>        this.desc = desc;<a name="line.508"></a>
 <span class="sourceLineNo">509</span>        this.tableRegions = tableRegions;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.510"></a>
+<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.510"></a>
 <span class="sourceLineNo">511</span>        new FSTableDescriptors(conf)<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          .createTableDescriptorForTableDirectory(snapshotDir, htd, false);<a name="line.512"></a>
 <span class="sourceLineNo">513</span>      }<a name="line.513"></a>
@@ -695,7 +695,7 @@
 <span class="sourceLineNo">687</span>        .setVersion(version)<a name="line.687"></a>
 <span class="sourceLineNo">688</span>        .build();<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.690"></a>
+<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.690"></a>
 <span class="sourceLineNo">691</span>      SnapshotDescriptionUtils.writeSnapshotInfo(desc, workingDir, fs);<a name="line.691"></a>
 <span class="sourceLineNo">692</span>      return new SnapshotBuilder(conf, fs, rootDir, htd, desc, regions);<a name="line.692"></a>
 <span class="sourceLineNo">693</span>    }<a name="line.693"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.html
index 110e99c..d115ecb 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.html
@@ -515,7 +515,7 @@
 <span class="sourceLineNo">507</span>        this.htd = htd;<a name="line.507"></a>
 <span class="sourceLineNo">508</span>        this.desc = desc;<a name="line.508"></a>
 <span class="sourceLineNo">509</span>        this.tableRegions = tableRegions;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.510"></a>
+<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.510"></a>
 <span class="sourceLineNo">511</span>        new FSTableDescriptors(conf)<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          .createTableDescriptorForTableDirectory(snapshotDir, htd, false);<a name="line.512"></a>
 <span class="sourceLineNo">513</span>      }<a name="line.513"></a>
@@ -695,7 +695,7 @@
 <span class="sourceLineNo">687</span>        .setVersion(version)<a name="line.687"></a>
 <span class="sourceLineNo">688</span>        .build();<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.690"></a>
+<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.690"></a>
 <span class="sourceLineNo">691</span>      SnapshotDescriptionUtils.writeSnapshotInfo(desc, workingDir, fs);<a name="line.691"></a>
 <span class="sourceLineNo">692</span>      return new SnapshotBuilder(conf, fs, rootDir, htd, desc, regions);<a name="line.692"></a>
 <span class="sourceLineNo">693</span>    }<a name="line.693"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html
index 110e99c..d115ecb 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.html
@@ -515,7 +515,7 @@
 <span class="sourceLineNo">507</span>        this.htd = htd;<a name="line.507"></a>
 <span class="sourceLineNo">508</span>        this.desc = desc;<a name="line.508"></a>
 <span class="sourceLineNo">509</span>        this.tableRegions = tableRegions;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.510"></a>
+<span class="sourceLineNo">510</span>        this.snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.510"></a>
 <span class="sourceLineNo">511</span>        new FSTableDescriptors(conf)<a name="line.511"></a>
 <span class="sourceLineNo">512</span>          .createTableDescriptorForTableDirectory(snapshotDir, htd, false);<a name="line.512"></a>
 <span class="sourceLineNo">513</span>      }<a name="line.513"></a>
@@ -695,7 +695,7 @@
 <span class="sourceLineNo">687</span>        .setVersion(version)<a name="line.687"></a>
 <span class="sourceLineNo">688</span>        .build();<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.690"></a>
+<span class="sourceLineNo">690</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.690"></a>
 <span class="sourceLineNo">691</span>      SnapshotDescriptionUtils.writeSnapshotInfo(desc, workingDir, fs);<a name="line.691"></a>
 <span class="sourceLineNo">692</span>      return new SnapshotBuilder(conf, fs, rootDir, htd, desc, regions);<a name="line.692"></a>
 <span class="sourceLineNo">693</span>    }<a name="line.693"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html
new file mode 100644
index 0000000..fa374c8
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html
@@ -0,0 +1,132 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * &lt;p&gt;<a name="line.9"></a>
+<span class="sourceLineNo">010</span> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> * &lt;p&gt;<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.snapshot;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import java.io.File;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.nio.file.Paths;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.util.UUID;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.commons.io.FileUtils;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.conf.Configuration;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.fs.Path;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.junit.AfterClass;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.junit.BeforeClass;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.junit.ClassRule;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.junit.experimental.categories.Category;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>@Category({MediumTests.class})<a name="line.33"></a>
+<span class="sourceLineNo">034</span>public class TestExportSnapshotWithTemporaryDirectory extends TestExportSnapshot {<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>  @ClassRule<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.37"></a>
+<span class="sourceLineNo">038</span>      HBaseClassTestRule.forClass(TestExportSnapshotWithTemporaryDirectory.class);<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>  protected static String TEMP_DIR = Paths.get("").toAbsolutePath().toString() + Path.SEPARATOR<a name="line.40"></a>
+<span class="sourceLineNo">041</span>      + UUID.randomUUID().toString();<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  @BeforeClass<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  public static void setUpBeforeClass() throws Exception {<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    setUpBaseConf(TEST_UTIL.getConfiguration());<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    TEST_UTIL.startMiniCluster(3);<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    TEST_UTIL.startMiniMapReduceCluster();<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  }<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  @AfterClass<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  public static void tearDownAfterClass() throws Exception {<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    TestExportSnapshot.tearDownAfterClass();<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    FileUtils.deleteDirectory(new File(TEMP_DIR));<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>  public static void setUpBaseConf(Configuration conf) {<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    TestExportSnapshot.setUpBaseConf(conf);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    conf.set(SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR, "file://" + TEMP_DIR + "/.tmpdir/");<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  }<a name="line.59"></a>
+<span class="sourceLineNo">060</span>}<a name="line.60"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html
index 2269247..9da1854 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html
@@ -132,7 +132,7 @@
 <span class="sourceLineNo">124</span><a name="line.124"></a>
 <span class="sourceLineNo">125</span>    final HRegion region = spy(hRegions.get(0));<a name="line.125"></a>
 <span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>    Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir);<a name="line.127"></a>
+<span class="sourceLineNo">127</span>    Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir, conf);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    final SnapshotManifest manifest =<a name="line.128"></a>
 <span class="sourceLineNo">129</span>        SnapshotManifest.create(conf, fs, workingDir, snapshot, monitor);<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    manifest.addTableDescriptor(table.getTableDescriptor());<a name="line.130"></a>
@@ -174,7 +174,7 @@
 <span class="sourceLineNo">166</span>  private void addRegionToSnapshot(SnapshotProtos.SnapshotDescription snapshot,<a name="line.166"></a>
 <span class="sourceLineNo">167</span>      HRegion region, SnapshotManifest manifest) throws Exception {<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    LOG.info("Adding region to snapshot: " + region.getRegionInfo().getRegionNameAsString());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir);<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir, conf);<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    SnapshotManifest.RegionVisitor visitor = createRegionVisitorWithDelay(snapshot, workingDir);<a name="line.170"></a>
 <span class="sourceLineNo">171</span>    manifest.addRegion(region, visitor);<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    LOG.info("Added the region to snapshot: " + region.getRegionInfo().getRegionNameAsString());<a name="line.172"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
index 4d4c0f0..d5181f0 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
@@ -26,96 +26,151 @@
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.snapshot;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertFalse;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import static org.junit.Assert.fail;<a name="line.21"></a>
-<span class="sourceLineNo">022</span><a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.io.IOException;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.conf.Configuration;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.fs.FileSystem;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.fs.Path;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HConstants;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.junit.After;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.junit.BeforeClass;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.junit.ClassRule;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.junit.Test;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.junit.experimental.categories.Category;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.slf4j.Logger;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.slf4j.LoggerFactory;<a name="line.39"></a>
-<span class="sourceLineNo">040</span><a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<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> * Test that the {@link SnapshotDescription} helper is helping correctly.<a name="line.44"></a>
-<span class="sourceLineNo">045</span> */<a name="line.45"></a>
-<span class="sourceLineNo">046</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.46"></a>
-<span class="sourceLineNo">047</span>public class TestSnapshotDescriptionUtils {<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>  @ClassRule<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.50"></a>
-<span class="sourceLineNo">051</span>      HBaseClassTestRule.forClass(TestSnapshotDescriptionUtils.class);<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static FileSystem fs;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  private static Path root;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  @BeforeClass<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public static void setupFS() throws Exception {<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    fs = UTIL.getTestFileSystem();<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    root = new Path(UTIL.getDataTestDir(), "hbase");<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  @After<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  public void cleanupFS() throws Exception {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    if (fs.exists(root)) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      if (!fs.delete(root, true)) {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>        throw new IOException("Failed to delete root test dir: " + root);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      }<a name="line.68"></a>
-<span class="sourceLineNo">069</span>      if (!fs.mkdirs(root)) {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>        throw new IOException("Failed to create root test dir: " + root);<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>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSnapshotDescriptionUtils.class);<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  @Test<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public void testValidateMissingTableName() throws IOException {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    Configuration conf = new Configuration(false);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    try {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      SnapshotDescriptionUtils.validate(SnapshotDescription.newBuilder().setName("fail").build(),<a name="line.82"></a>
-<span class="sourceLineNo">083</span>        conf);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      fail("Snapshot was considered valid without a table name");<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    } catch (IllegalArgumentException e) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      LOG.debug("Correctly failed when snapshot doesn't have a tablename");<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>   * Test that we throw an exception if there is no working snapshot directory when we attempt to<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * 'complete' the snapshot<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @throws Exception on failure<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @Test<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public void testCompleteSnapshotWithNoSnapshotDirectoryFailure() throws Exception {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    Path snapshotDir = new Path(root, HConstants.SNAPSHOT_DIR_NAME);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    Path tmpDir = new Path(snapshotDir, ".tmp");<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    Path workingDir = new Path(tmpDir, "not_a_snapshot");<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    assertFalse("Already have working snapshot dir: " + workingDir<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        + " but shouldn't. Test file leak?", fs.exists(workingDir));<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    SnapshotDescription snapshot = SnapshotDescription.newBuilder().setName("snapshot").build();<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    try {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      SnapshotDescriptionUtils.completeSnapshot(snapshot, root, workingDir, fs);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      fail("Shouldn't successfully complete move of a non-existent directory.");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    } catch (IOException e) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      LOG.info("Correctly failed to move non-existant directory: " + e.getMessage());<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    }<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">021</span>import static org.junit.Assert.assertTrue;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import static org.junit.Assert.fail;<a name="line.22"></a>
+<span class="sourceLineNo">023</span><a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.conf.Configuration;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.fs.FileSystem;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.fs.Path;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HConstants;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.junit.After;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.junit.BeforeClass;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.junit.ClassRule;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.junit.Test;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.junit.experimental.categories.Category;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.slf4j.Logger;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.slf4j.LoggerFactory;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<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> * Test that the {@link SnapshotDescription} helper is helping correctly.<a name="line.45"></a>
+<span class="sourceLineNo">046</span> */<a name="line.46"></a>
+<span class="sourceLineNo">047</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.47"></a>
+<span class="sourceLineNo">048</span>public class TestSnapshotDescriptionUtils {<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  @ClassRule<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.51"></a>
+<span class="sourceLineNo">052</span>      HBaseClassTestRule.forClass(TestSnapshotDescriptionUtils.class);<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private static FileSystem fs;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  private static Path root;<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @BeforeClass<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static void setupFS() throws Exception {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    fs = UTIL.getTestFileSystem();<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    root = new Path(UTIL.getDataTestDir(), "hbase");<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  @After<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  public void cleanupFS() throws Exception {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    if (fs.exists(root)) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      if (!fs.delete(root, true)) {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>        throw new IOException("Failed to delete root test dir: " + root);<a name="line.68"></a>
+<span class="sourceLineNo">069</span>      }<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      if (!fs.mkdirs(root)) {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>        throw new IOException("Failed to create root test dir: " + root);<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>    EnvironmentEdgeManagerTestHelper.reset();<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSnapshotDescriptionUtils.class);<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  @Test<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  public void testValidateMissingTableName() throws IOException {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    Configuration conf = new Configuration(false);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    try {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      SnapshotDescriptionUtils.validate(SnapshotDescription.newBuilder().setName("fail").build(),<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        conf);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      fail("Snapshot was considered valid without a table name");<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    } catch (IllegalArgumentException e) {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      LOG.debug("Correctly failed when snapshot doesn't have a tablename");<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>  /**<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * Test that we throw an exception if there is no working snapshot directory when we attempt to<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * 'complete' the snapshot<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * @throws Exception on failure<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  @Test<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  public void testCompleteSnapshotWithNoSnapshotDirectoryFailure() throws Exception {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    Path snapshotDir = new Path(root, HConstants.SNAPSHOT_DIR_NAME);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    Path tmpDir = new Path(snapshotDir, ".tmp");<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    Path workingDir = new Path(tmpDir, "not_a_snapshot");<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    assertFalse("Already have working snapshot dir: " + workingDir<a name="line.101"></a>
+<span class="sourceLineNo">102</span>        + " but shouldn't. Test file leak?", fs.exists(workingDir));<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    SnapshotDescription snapshot = SnapshotDescription.newBuilder().setName("snapshot").build();<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    try {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      SnapshotDescriptionUtils.completeSnapshot(snapshot, root, workingDir, fs);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      fail("Shouldn't successfully complete move of a non-existent directory.");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    } catch (IOException e) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      LOG.info("Correctly failed to move non-existant directory: " + e.getMessage());<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><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  @Test<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public void testIsSubDirectoryWorks() {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    Path rootDir = new Path("hdfs://root/.hbase-snapshot/");<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(rootDir, rootDir));<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        new Path("hdfs://root/.hbase-snapshotdir"), rootDir));<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        new Path("hdfs://root/.hbase-snapshot"), rootDir));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        new Path("hdfs://.hbase-snapshot"), rootDir));<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        new Path("hdfs://.hbase-snapshot/.tmp"), rootDir));<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(new Path("hdfs://root"), rootDir));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    assertTrue(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        new Path("hdfs://root/.hbase-snapshot/.tmp"), rootDir));<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    assertTrue(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.128"></a>
+<span class="sourceLineNo">129</span>        new Path("hdfs://root/.hbase-snapshot/.tmp/snapshot"), rootDir));<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        new Path("s3://root/.hbase-snapshot/"), rootDir));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(new Path("s3://root"), rootDir));<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    assertFalse(SnapshotDescriptionUtils.isSubDirectoryOf(<a name="line.134"></a>
+<span class="sourceLineNo">135</span>        new Path("s3://root/.hbase-snapshot/.tmp/snapshot"), rootDir));<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>  @Test<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  public void testIsWithinWorkingDir() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    Configuration conf = new Configuration();<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    conf.set(HConstants.HBASE_DIR, "hdfs://root/");<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        new Path("hdfs://root/"), conf));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        new Path("hdfs://root/.hbase-snapshotdir"), conf));<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        new Path("hdfs://root/.hbase-snapshot"), conf));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        new Path("hdfs://.hbase-snapshot"), conf));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        new Path("hdfs://.hbase-snapshot/.tmp"), conf));<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(new Path("hdfs://root"), conf));<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    assertTrue(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        new Path("hdfs://root/.hbase-snapshot/.tmp"), conf));<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    assertTrue(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        new Path("hdfs://root/.hbase-snapshot/.tmp/snapshot"), conf));<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        new Path("s3://root/.hbase-snapshot/"), conf));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(new Path("s3://root"), conf));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    assertFalse(SnapshotDescriptionUtils.isWithinDefaultWorkingDir(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        new Path("s3://root/.hbase-snapshot/.tmp/snapshot"), conf));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>}<a name="line.165"></a>
 
 
 


[46/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index a34a96a..5bc4312 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -281,10 +281,10 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>3735</td>
+<td>3739</td>
 <td>0</td>
 <td>0</td>
-<td>15232</td></tr></table></div>
+<td>15225</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -5207,7 +5207,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.MasterSnapshotVerifier.java">org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>2</td></tr>
+<td>1</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache.java">org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java</a></td>
 <td>0</td>
@@ -7927,7 +7927,7 @@
 <td><a href="#org.apache.hadoop.hbase.rest.TestTableScan.java">org/apache/hadoop/hbase/rest/TestTableScan.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>18</td></tr>
+<td>12</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.rest.VersionResource.java">org/apache/hadoop/hbase/rest/VersionResource.java</a></td>
 <td>0</td>
@@ -9806,19 +9806,19 @@
 <li>caseIndent: <tt>&quot;2&quot;</tt></li>
 <li>basicOffset: <tt>&quot;2&quot;</tt></li>
 <li>lineWrappingIndentation: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>4835</td>
+<td>4829</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>javadoc</td>
 <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>733</td>
+<td>734</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>3540</td>
+<td>3539</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -9836,7 +9836,7 @@
 <ul>
 <li>max: <tt>&quot;100&quot;</tt></li>
 <li>ignorePattern: <tt>&quot;^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated&quot;</tt></li></ul></td>
-<td>1487</td>
+<td>1486</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -19148,7 +19148,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 0 has parse error. Details: no viable alternative at input '   *' while parsing JAVADOC_TAG</td>
 <td>117</td></tr>
 <tr class="b">
@@ -68407,32 +68407,26 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>92</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>196</td></tr></table></div>
+<td>197</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache.java">org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.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>133</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>
@@ -68441,13 +68435,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.SnapshotHFileCleaner.java">org/apache/hadoop/hbase/master/snapshot/SnapshotHFileCleaner.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>
@@ -68456,190 +68450,190 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.SnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/SnapshotManager.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>'if' construct must use '{}'s.</td>
 <td>218</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>289</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>293</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>331</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>406</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>549</td></tr>
-<tr class="b">
+<td>553</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>638</td></tr>
-<tr class="a">
+<td>642</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>641</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>691</td></tr>
+<td>645</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>760</td></tr>
+<td>695</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>762</td></tr>
+<td>764</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>813</td></tr>
+<td>766</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>817</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 7 should be on the previous line.</td>
-<td>971</td></tr>
-<tr class="a">
+<td>975</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>999</td></tr>
-<tr class="b">
+<td>1003</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>1054</td></tr>
-<tr class="a">
+<td>1058</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>1058</td></tr></table></div>
+<td>1062</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.TakeSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.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 103).</td>
-<td>64</td></tr>
-<tr class="b">
+<td>68</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>191</td></tr>
-<tr class="a">
+<td>205</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>275</td></tr></table></div>
+<td>304</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.TestSnapshotHFileCleaner.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.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>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 103).</td>
 <td>126</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>138</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>163</td></tr>
-<tr class="a">
+<td>164</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>189</td></tr>
-<tr class="b">
+<td>191</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>195</td></tr></table></div>
+<td>197</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.snapshot.TestSnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.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>
@@ -68648,13 +68642,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.CachedMobFile.java">org/apache/hadoop/hbase/mob/CachedMobFile.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>
@@ -68663,55 +68657,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.DefaultMobStoreCompactor.java">org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.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.KeyValue' import.</td>
 <td>31</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 8, expected level should be one of the following: 4, 6.</td>
 <td>84</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 10, expected level should be one of the following: 6, 8.</td>
 <td>89</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 8, expected level should be one of the following: 4, 6.</td>
 <td>91</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>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
 <td>92</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>108</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 201 lines (max allowed is 150).</td>
 <td>166</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>
@@ -68720,37 +68714,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.DefaultMobStoreFlusher.java">org/apache/hadoop/hbase/mob/DefaultMobStoreFlusher.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>108</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>120</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>166</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>178</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>
@@ -68759,19 +68753,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.ExpiredMobFileCleaner.java">org/apache/hadoop/hbase/mob/ExpiredMobFileCleaner.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.client.Admin' import.</td>
 <td>32</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>
@@ -68780,19 +68774,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobCacheConfig.java">org/apache/hadoop/hbase/mob/MobCacheConfig.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>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.HColumnDescriptor.</td>
 <td>22</td></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>
@@ -68801,13 +68795,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobConstants.java">org/apache/hadoop/hbase/mob/MobConstants.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>
@@ -68816,43 +68810,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobFile.java">org/apache/hadoop/hbase/mob/MobFile.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>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>55</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>71</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>83</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>118</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>127</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>
@@ -68861,19 +68855,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobFileCache.java">org/apache/hadoop/hbase/mob/MobFileCache.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.util.IdLock' 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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -68882,13 +68876,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobFileName.java">org/apache/hadoop/hbase/mob/MobFileName.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>
@@ -68897,13 +68891,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobTestUtil.java">org/apache/hadoop/hbase/mob/MobTestUtil.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>
@@ -68912,97 +68906,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.MobUtils.java">org/apache/hadoop/hbase/mob/MobUtils.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>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</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>291</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>377</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>426</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>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>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>527</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>551</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>578</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>604</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>631</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 133).</td>
 <td>634</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>660</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>703</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 133).</td>
 <td>808</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>
@@ -69011,217 +69005,217 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.TestDefaultMobStoreFlusher.java">org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.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>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.apache.hadoop.hbase.client.*.</td>
 <td>28</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>47</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>48</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>49</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>50</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>51</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>52</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>53</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>54</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>'member def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>56</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 1, expected level should be 2.</td>
 <td>59</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 3, 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>'method def rcurly' has incorrect indentation level 1, expected level should be 2.</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>'method def modifier' has incorrect indentation level 1, expected level should be 2.</td>
 <td>64</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>66</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 rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>67</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 1, expected level should be 2.</td>
 <td>69</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 3, expected level should be 4.</td>
 <td>71</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>72</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 3, expected level should be 4.</td>
 <td>73</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>74</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 3, expected level should be 4.</td>
 <td>75</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>77</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 rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>78</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 1, expected level should be 2.</td>
 <td>80</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 3, expected level should be 4.</td>
 <td>82</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>83</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 3, expected level should be 4.</td>
 <td>84</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>85</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 3, expected level should be 4.</td>
 <td>86</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>87</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 3, expected level should be 4.</td>
 <td>88</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>90</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 rcurly' has incorrect indentation level 1, expected level should be 2.</td>
 <td>91</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>
@@ -69230,13 +69224,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.TestExpiredMobFileCleaner.java">org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.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>AvoidStarImport</td>
@@ -69245,31 +69239,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.compactions.MobCompactor.java">org/apache/hadoop/hbase/mob/compactions/MobCompactor.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.client.ColumnFamilyDescriptor' import.</td>
 <td>32</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>75</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>
@@ -69278,43 +69272,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.compactions.PartitionedMobCompactionRequest.java">org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactionRequest.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>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>97</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>181</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 36 should have line break after.</td>
 <td>181</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -69323,67 +69317,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.compactions.PartitionedMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactor.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.tool.LoadIncrementalHFiles' import.</td>
 <td>86</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>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 151 lines (max allowed is 150).</td>
 <td>161</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>165</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>285</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>330</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>424</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>441</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' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>448</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>
@@ -69392,43 +69386,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.compactions.TestMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.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>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>273</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 112).</td>
 <td>926</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>932</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1171</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 rparen' has incorrect indentation level 6, expected level should be 2.</td>
 <td>1175</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>
@@ -69437,61 +69431,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mob.compactions.TestPartitionedMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/TestPartitionedMobCompactor.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>234</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>353</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>359</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>435</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>573</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>682</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>705</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>'.' has incorrect indentation level 6, expected level should be 8.</td>
 <td>846</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>
@@ -69500,19 +69494,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.LogMonitoring.java">org/apache/hadoop/hbase/monitoring/LogMonitoring.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.io.IOUtils' import.</td>
 <td>32</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>
@@ -69521,19 +69515,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.MemoryBoundedLogMessageBuffer.java">org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.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>VisibilityModifier</td>
 <td>Variable 'message' must be private and have accessor methods.</td>
 <td>96</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
@@ -69542,31 +69536,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.MonitoredRPCHandlerImpl.java">org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.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.client.Operation' import.</td>
 <td>26</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>125</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>152</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>
@@ -69575,13 +69569,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.java">org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.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>
@@ -69590,13 +69584,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.StateDumpServlet.java">org/apache/hadoop/hbase/monitoring/StateDumpServlet.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>
@@ -69605,13 +69599,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.TaskMonitor.java">org/apache/hadoop/hbase/monitoring/TaskMonitor.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>
@@ -69620,13 +69614,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.TestTaskMonitor.java">org/apache/hadoop/hbase/monitoring/TestTaskMonitor.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>AvoidStarImport</td>
@@ -69635,25 +69629,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.monitoring.ThreadMonitoring.java">org/apache/hadoop/hbase/monitoring/ThreadMonitoring.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>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>
 <td>At-clause should have a non-empty description.</td>
 <td>54</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>
@@ -69662,61 +69656,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mttr.IntegrationTestMTTR.java">org/apache/hadoop/hbase/mttr/IntegrationTestMTTR.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.testclassification.IntegrationTests' import.</td>
 <td>63</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>126</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>275</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>344</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>347</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 12, expected level should be 10.</td>
 <td>630</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 12, expected level should be 10.</td>
 <td>631</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 12, expected level should be 10.</td>
 <td>632</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>
@@ -69725,25 +69719,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namespace.NamespaceStateManager.java">org/apache/hadoop/hbase/namespace/NamespaceStateManager.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>78</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>79</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>
@@ -69752,13 +69746,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namespace.NamespaceTableAndRegionInfo.java">org/apache/hadoop/hbase/namespace/NamespaceTableAndRegionInfo.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>
@@ -69767,31 +69761,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.namespace.TestNamespaceAuditor.java">org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.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>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.Waiter.ExplainingPredicate.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.RetryCounter.</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>87</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>
@@ -69800,25 +69794,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.net.Address.java">org/apache/hadoop/hbase/net/Address.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>FinalClass</td>
 <td>Class Address should be declared as final.</td>
 <td>33</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>65</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>
@@ -69827,19 +69821,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.net.TestAddress.java">org/apache/hadoop/hbase/net/TestAddress.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>UnusedImports</td>
 <td>Unused import - org.junit.Assert.</td>
 <td>24</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>
@@ -69848,151 +69842,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.nio.ByteBuff.java">org/apache/hadoop/hbase/nio/ByteBuff.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>50</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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>177</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>186</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>193</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>200</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>201</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>209</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>228</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>234</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>243</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>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>287</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>313</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>322</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>349</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>358</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>389</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>407</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>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>489</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>489</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>553</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>
@@ -70001,181 +69995,181 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.nio.MultiByteBuff.java">org/apache/hadoop/hbase/nio/MultiByteBuff.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>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>91</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>100</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>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>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>177</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>208</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>317</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>356</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>417</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>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>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>542</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>554</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>571</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>581</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>652</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>670</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>671</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>705</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>780</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>859</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>881</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>924</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>970</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>985</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>1021</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>1028</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>1038</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>1039</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>
@@ -70184,13 +70178,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.nio.SingleByteBuff.java">org/apache/hadoop/hbase/nio/SingleByteBuff.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>
@@ -70199,61 +70193,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.MasterProcedureManager.java">org/apache/hadoop/hbase/procedure/MasterProcedureManager.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>UnusedImports</td>
 <td>Unused import - org.apache.yetus.audience.InterfaceStability.</td>
 <td>25</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.Stoppable' import.</td>
 <td>26</td></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.zookeeper.KeeperException' 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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>63</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>64</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>74</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>83</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>
@@ -70262,91 +70256,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.Procedure.java">org/apache/hadoop/hbase/procedure/Procedure.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.errorhandling.ForeignException' import.</td>
 <td>31</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>243</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>251</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>264</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>295</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>307</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>317</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>318</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>343</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>344</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>355</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>356</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>358</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>
@@ -70355,73 +70349,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinator.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.DaemonThreadFactory' import.</td>
 <td>35</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>70</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>83</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>85</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>99</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>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>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</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 103).</td>
 <td>181</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>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>236</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>
@@ -70430,19 +70424,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureCoordinatorRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinatorRpcs.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.errorhandling.ForeignException' import.</td>
 <td>25</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>
@@ -70451,25 +70445,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureManagerHost.java">org/apache/hadoop/hbase/procedure/ProcedureManagerHost.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 'java.util.List' import.</td>
 <td>24</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>36</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>
@@ -70478,103 +70472,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureMember.java">org/apache/hadoop/hbase/procedure/ProcedureMember.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.DaemonThreadFactory' import.</td>
 <td>32</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>72</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>82</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>107</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>108</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 modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>176</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>177</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' has incorrect indentation level 5, expected level should be 4.</td>
 <td>178</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 7, expected level should be 6.</td>
 <td>179</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 7, expected level should be 6.</td>
 <td>180</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 5, expected level should be 4.</td>
 <td>181</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' has incorrect indentation level 5, expected level should be 4.</td>
 <td>182</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 5, expected level should be 4.</td>
 <td>184</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 5, expected level should be 4.</td>
 <td>185</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 3, expected level should be 2.</td>
 <td>186</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>
@@ -70583,25 +70577,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.ProcedureMemberRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureMemberRpcs.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.errorhandling.ForeignException' 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>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>50</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>
@@ -70610,25 +70604,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.RegionServerProcedureManager.java">org/apache/hadoop/hbase/procedure/RegionServerProcedureManager.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.regionserver.RegionServerServices' 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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>38</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>
@@ -70637,13 +70631,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.SimpleMasterProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleMasterProcedureManager.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>
@@ -70652,31 +70646,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.SimpleRSProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleRSProcedureManager.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.errorhandling.ForeignException' import.</td>
 <td>37</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>145</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>156</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>
@@ -70685,61 +70679,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure.Subprocedure.java">org/apache/hadoop/hbase/procedure/Subprocedure.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>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>135</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>245</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>258</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-

<TRUNCATED>

[10/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="li

<TRUNCATED>

[25/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
index 025b084..b9f473a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
@@ -89,504 +89,517 @@
 <span class="sourceLineNo">081</span>  private final ForeignExceptionSnare monitor;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  private final Configuration conf;<a name="line.82"></a>
 <span class="sourceLineNo">083</span>  private final Path workingDir;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private final FileSystem fs;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private int manifestSizeLimit;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private SnapshotManifest(final Configuration conf, final FileSystem fs,<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      final ForeignExceptionSnare monitor) {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    this.monitor = monitor;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    this.desc = desc;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    this.workingDir = workingDir;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    this.conf = conf;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    this.fs = fs;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    this.manifestSizeLimit = conf.getInt(SNAPSHOT_MANIFEST_SIZE_LIMIT_CONF_KEY, 64 * 1024 * 1024);<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>   * Return a SnapshotManifest instance, used for writing a snapshot.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   *<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * There are two usage pattern:<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   *  - The Master will create a manifest, add the descriptor, offline regions<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   *    and consolidate the snapshot by writing all the pending stuff on-disk.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   *      manifest = SnapshotManifest.create(...)<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   *      manifest.addRegion(tableDir, hri)<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *      manifest.consolidate()<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   *  - The RegionServer will create a single region manifest<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   *      manifest = SnapshotManifest.create(...)<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   *      manifest.addRegion(region)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static SnapshotManifest create(final Configuration conf, final FileSystem fs,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      final ForeignExceptionSnare monitor) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return new SnapshotManifest(conf, fs, workingDir, desc, monitor);<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Return a SnapshotManifest instance with the information already loaded in-memory.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   *    SnapshotManifest manifest = SnapshotManifest.open(...)<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   *    TableDescriptor htd = manifest.getTableDescriptor()<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   *    for (SnapshotRegionManifest regionManifest: manifest.getRegionManifests())<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   *      hri = regionManifest.getRegionInfo()<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   *      for (regionManifest.getFamilyFiles())<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>  public static SnapshotManifest open(final Configuration conf, final FileSystem fs,<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      final Path workingDir, final SnapshotDescription desc) throws IOException {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    SnapshotManifest manifest = new SnapshotManifest(conf, fs, workingDir, desc, null);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    manifest.load();<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return manifest;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * Add the table descriptor to the snapshot manifest<a name="line.137"></a>
+<span class="sourceLineNo">084</span>  private final FileSystem rootFs;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final FileSystem workingDirFs;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private int manifestSizeLimit;<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>   * @param conf configuration file for HBase setup<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * @param rootFs root filesystem containing HFiles<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * @param workingDir file path of where the manifest should be located<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * @param desc description of snapshot being taken<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * @param monitor monitor of foreign exceptions<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * @throws IOException if the working directory file system cannot be<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   *                     determined from the config file<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private SnapshotManifest(final Configuration conf, final FileSystem rootFs,<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      final ForeignExceptionSnare monitor) throws IOException {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    this.monitor = monitor;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    this.desc = desc;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    this.workingDir = workingDir;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    this.conf = conf;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    this.rootFs = rootFs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    this.workingDirFs = this.workingDir.getFileSystem(this.conf);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    this.manifestSizeLimit = conf.getInt(SNAPSHOT_MANIFEST_SIZE_LIMIT_CONF_KEY, 64 * 1024 * 1024);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  }<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>   * Return a SnapshotManifest instance, used for writing a snapshot.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   *<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * There are two usage pattern:<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   *  - The Master will create a manifest, add the descriptor, offline regions<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   *    and consolidate the snapshot by writing all the pending stuff on-disk.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   *      manifest = SnapshotManifest.create(...)<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   *      manifest.addRegion(tableDir, hri)<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *      manifest.consolidate()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   *  - The RegionServer will create a single region manifest<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   *      manifest = SnapshotManifest.create(...)<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   *      manifest.addRegion(region)<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  public static SnapshotManifest create(final Configuration conf, final FileSystem fs,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      final ForeignExceptionSnare monitor) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    return new SnapshotManifest(conf, fs, workingDir, desc, monitor);<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Return a SnapshotManifest instance with the information already loaded in-memory.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   *    SnapshotManifest manifest = SnapshotManifest.open(...)<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   *    TableDescriptor htd = manifest.getTableDescriptor()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   *    for (SnapshotRegionManifest regionManifest: manifest.getRegionManifests())<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   *      hri = regionManifest.getRegionInfo()<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   *      for (regionManifest.getFamilyFiles())<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   *        ...<a name="line.137"></a>
 <span class="sourceLineNo">138</span>   */<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void addTableDescriptor(final TableDescriptor htd) throws IOException {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.htd = htd;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>  interface RegionVisitor&lt;TRegion, TFamily&gt; {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TRegion regionOpen(final RegionInfo regionInfo) throws IOException;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    void regionClose(final TRegion region) throws IOException;<a name="line.145"></a>
+<span class="sourceLineNo">139</span>  public static SnapshotManifest open(final Configuration conf, final FileSystem fs,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      final Path workingDir, final SnapshotDescription desc) throws IOException {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    SnapshotManifest manifest = new SnapshotManifest(conf, fs, workingDir, desc, null);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    manifest.load();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return manifest;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
 <span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>    TFamily familyOpen(final TRegion region, final byte[] familyName) throws IOException;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    void familyClose(final TRegion region, final TFamily family) throws IOException;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void storeFile(final TRegion region, final TFamily family, final StoreFileInfo storeFile)<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      throws IOException;<a name="line.151"></a>
+<span class="sourceLineNo">147</span>  /**<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * Add the table descriptor to the snapshot manifest<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   */<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public void addTableDescriptor(final TableDescriptor htd) throws IOException {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    this.htd = htd;<a name="line.151"></a>
 <span class="sourceLineNo">152</span>  }<a name="line.152"></a>
 <span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private RegionVisitor createRegionVisitor(final SnapshotDescription desc) throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    switch (getSnapshotFormat(desc)) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION:<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        return new SnapshotManifestV1.ManifestBuilder(conf, fs, workingDir);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION:<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        return new SnapshotManifestV2.ManifestBuilder(conf, fs, workingDir);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      default:<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public void addMobRegion(RegionInfo regionInfo) throws IOException {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    // Visit the region and add it to the manifest<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addMobRegion(regionInfo, visitor);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @VisibleForTesting<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  protected void addMobRegion(RegionInfo regionInfo, RegionVisitor visitor) throws IOException {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // 1. dump region meta info into the snapshot directory<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    LOG.debug("Storing mob region '" + regionInfo + "' region-info for snapshot.");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    Object regionData = visitor.regionOpen(regionInfo);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    monitor.rethrowException();<a name="line.179"></a>
+<span class="sourceLineNo">154</span>  interface RegionVisitor&lt;TRegion, TFamily&gt; {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    TRegion regionOpen(final RegionInfo regionInfo) throws IOException;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    void regionClose(final TRegion region) throws IOException;<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    TFamily familyOpen(final TRegion region, final byte[] familyName) throws IOException;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    void familyClose(final TRegion region, final TFamily family) throws IOException;<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    void storeFile(final TRegion region, final TFamily family, final StoreFileInfo storeFile)<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throws IOException;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  private RegionVisitor createRegionVisitor(final SnapshotDescription desc) throws IOException {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    switch (getSnapshotFormat(desc)) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION:<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        return new SnapshotManifestV1.ManifestBuilder(conf, rootFs, workingDir);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION:<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        return new SnapshotManifestV2.ManifestBuilder(conf, rootFs, workingDir);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      default:<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public void addMobRegion(RegionInfo regionInfo) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.179"></a>
 <span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // 2. iterate through all the stores in the region<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    LOG.debug("Creating references for mob files");<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    Path mobRegionPath = MobUtils.getMobRegionPath(conf, regionInfo.getTable());<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // 2.1. build the snapshot reference for the store if it's a mob store<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      if (!hcd.isMobEnabled()) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        continue;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      Object familyData = visitor.familyOpen(regionData, hcd.getName());<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      monitor.rethrowException();<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>      Path storePath = MobUtils.getMobFamilyPath(mobRegionPath, hcd.getNameAsString());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      List&lt;StoreFileInfo&gt; storeFiles = getStoreFiles(storePath);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      if (storeFiles == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        if (LOG.isDebugEnabled()) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>          LOG.debug("No mob files under family: " + hcd.getNameAsString());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        }<a name="line.198"></a>
+<span class="sourceLineNo">181</span>    // Visit the region and add it to the manifest<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addMobRegion(regionInfo, visitor);<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>  @VisibleForTesting<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  protected void addMobRegion(RegionInfo regionInfo, RegionVisitor visitor) throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // 1. dump region meta info into the snapshot directory<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    LOG.debug("Storing mob region '" + regionInfo + "' region-info for snapshot.");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    Object regionData = visitor.regionOpen(regionInfo);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    monitor.rethrowException();<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    // 2. iterate through all the stores in the region<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    LOG.debug("Creating references for mob files");<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>    Path mobRegionPath = MobUtils.getMobRegionPath(conf, regionInfo.getTable());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      // 2.1. build the snapshot reference for the store if it's a mob store<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      if (!hcd.isMobEnabled()) {<a name="line.198"></a>
 <span class="sourceLineNo">199</span>        continue;<a name="line.199"></a>
 <span class="sourceLineNo">200</span>      }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>      addReferenceFiles(visitor, regionData, familyData, storeFiles, true);<a name="line.202"></a>
+<span class="sourceLineNo">201</span>      Object familyData = visitor.familyOpen(regionData, hcd.getName());<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      monitor.rethrowException();<a name="line.202"></a>
 <span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>      visitor.familyClose(regionData, familyData);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    visitor.regionClose(regionData);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Creates a 'manifest' for the specified region, by reading directly from the HRegion object.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * This is used by the "online snapshot" when the table is enabled.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  public void addRegion(final HRegion region) throws IOException {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // Visit the region and add it to the manifest<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addRegion(region, visitor);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  @VisibleForTesting<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  protected void addRegion(final HRegion region, RegionVisitor visitor) throws IOException {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    // 1. dump region meta info into the snapshot directory<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    LOG.debug("Storing '" + region + "' region-info for snapshot.");<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    Object regionData = visitor.regionOpen(region.getRegionInfo());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    monitor.rethrowException();<a name="line.226"></a>
+<span class="sourceLineNo">204</span>      Path storePath = MobUtils.getMobFamilyPath(mobRegionPath, hcd.getNameAsString());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      List&lt;StoreFileInfo&gt; storeFiles = getStoreFiles(storePath);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      if (storeFiles == null) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        if (LOG.isDebugEnabled()) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          LOG.debug("No mob files under family: " + hcd.getNameAsString());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        continue;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>      addReferenceFiles(visitor, regionData, familyData, storeFiles, true);<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>      visitor.familyClose(regionData, familyData);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    visitor.regionClose(regionData);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Creates a 'manifest' for the specified region, by reading directly from the HRegion object.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * This is used by the "online snapshot" when the table is enabled.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public void addRegion(final HRegion region) throws IOException {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    // 2. iterate through all the stores in the region<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    LOG.debug("Creating references for hfiles");<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    for (HStore store : region.getStores()) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      // 2.1. build the snapshot reference for the store<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      Object familyData = visitor.familyOpen(regionData,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          store.getColumnFamilyDescriptor().getName());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      monitor.rethrowException();<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>      List&lt;HStoreFile&gt; storeFiles = new ArrayList&lt;&gt;(store.getStorefiles());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (LOG.isDebugEnabled()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
+<span class="sourceLineNo">228</span>    // Visit the region and add it to the manifest<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    addRegion(region, visitor);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @VisibleForTesting<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  protected void addRegion(final HRegion region, RegionVisitor visitor) throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // 1. dump region meta info into the snapshot directory<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.debug("Storing '" + region + "' region-info for snapshot.");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    Object regionData = visitor.regionOpen(region.getRegionInfo());<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    monitor.rethrowException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // 2. iterate through all the stores in the region<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    LOG.debug("Creating references for hfiles");<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>      // 2.2. iterate through all the store's files and create "references".<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      for (int i = 0, sz = storeFiles.size(); i &lt; sz; i++) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        HStoreFile storeFile = storeFiles.get(i);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        monitor.rethrowException();<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>        // create "reference" to this store file.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        LOG.debug("Adding reference for file (" + (i+1) + "/" + sz + "): " + storeFile.getPath());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        visitor.storeFile(regionData, familyData, storeFile.getFileInfo());<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      visitor.familyClose(regionData, familyData);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    visitor.regionClose(regionData);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Creates a 'manifest' for the specified region, by reading directly from the disk.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * This is used by the "offline snapshot" when the table is disabled.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  public void addRegion(final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Visit the region and add it to the manifest<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    addRegion(tableDir, regionInfo, visitor);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @VisibleForTesting<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  protected void addRegion(final Path tableDir, final RegionInfo regionInfo, RegionVisitor visitor)<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      throws IOException {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    boolean isMobRegion = MobUtils.isMobRegionInfo(regionInfo);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    try {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      Path baseDir = tableDir;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      // Open the RegionFS<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      if (isMobRegion) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        baseDir = FSUtils.getTableDir(MobUtils.getMobHome(conf), regionInfo.getTable());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, fs,<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        baseDir, regionInfo, true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      monitor.rethrowException();<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>      // 1. dump region meta info into the snapshot directory<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      LOG.debug("Storing region-info for snapshot.");<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      Object regionData = visitor.regionOpen(regionInfo);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      monitor.rethrowException();<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // 2. iterate through all the stores in the region<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.debug("Creating references for hfiles");<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>      // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      // in batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // checking to see if we have all the files until we are sure), but the limit is currently<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      // 1000 files/batch, far more than the number of store files under a single column family.<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      if (familyNames != null) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        for (String familyName: familyNames) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          Object familyData = visitor.familyOpen(regionData, Bytes.toBytes(familyName));<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          monitor.rethrowException();<a name="line.299"></a>
+<span class="sourceLineNo">242</span>    for (HStore store : region.getStores()) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      // 2.1. build the snapshot reference for the store<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      Object familyData = visitor.familyOpen(regionData,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          store.getColumnFamilyDescriptor().getName());<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      monitor.rethrowException();<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>      List&lt;HStoreFile&gt; storeFiles = new ArrayList&lt;&gt;(store.getStorefiles());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      if (LOG.isDebugEnabled()) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>      // 2.2. iterate through all the store's files and create "references".<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      for (int i = 0, sz = storeFiles.size(); i &lt; sz; i++) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        HStoreFile storeFile = storeFiles.get(i);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        monitor.rethrowException();<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // create "reference" to this store file.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        LOG.debug("Adding reference for file (" + (i+1) + "/" + sz + "): " + storeFile.getPath());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        visitor.storeFile(regionData, familyData, storeFile.getFileInfo());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      visitor.familyClose(regionData, familyData);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    visitor.regionClose(regionData);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  /**<a name="line.267"></a>
+<span class="sourceLineNo">268</span>   * Creates a 'manifest' for the specified region, by reading directly from the disk.<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * This is used by the "offline snapshot" when the table is disabled.<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  public void addRegion(final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    // Visit the region and add it to the manifest<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    addRegion(tableDir, regionInfo, visitor);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  protected void addRegion(final Path tableDir, final RegionInfo regionInfo, RegionVisitor visitor)<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      throws IOException {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    boolean isMobRegion = MobUtils.isMobRegionInfo(regionInfo);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      Path baseDir = tableDir;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      // Open the RegionFS<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      if (isMobRegion) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        baseDir = FSUtils.getTableDir(MobUtils.getMobHome(conf), regionInfo.getTable());<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, rootFs,<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        baseDir, regionInfo, true);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      monitor.rethrowException();<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      // 1. dump region meta info into the snapshot directory<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      LOG.debug("Storing region-info for snapshot.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      Object regionData = visitor.regionOpen(regionInfo);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      monitor.rethrowException();<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>      // 2. iterate through all the stores in the region<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      LOG.debug("Creating references for hfiles");<a name="line.299"></a>
 <span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>          Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          if (storeFiles == null) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>            if (LOG.isDebugEnabled()) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>              LOG.debug("No files under family: " + familyName);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            continue;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>          }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>          // 2.1. build the snapshot reference for the store<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          // iterate through all the store's files and create "references".<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          addReferenceFiles(visitor, regionData, familyData, storeFiles, false);<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>          visitor.familyClose(regionData, familyData);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      visitor.regionClose(regionData);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    } catch (IOException e) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // the mob directory might not be created yet, so do nothing when it is a mob region<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (!isMobRegion) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        throw e;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private List&lt;StoreFileInfo&gt; getStoreFiles(Path storeDir) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    FileStatus[] stats = FSUtils.listStatus(fs, storeDir);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    if (stats == null) return null;<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ArrayList&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(stats.length);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    for (int i = 0; i &lt; stats.length; ++i) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      storeFiles.add(new StoreFileInfo(conf, fs, stats[i]));<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    return storeFiles;<a name="line.333"></a>
+<span class="sourceLineNo">301</span>      // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // in batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      // checking to see if we have all the files until we are sure), but the limit is currently<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      // 1000 files/batch, far more than the number of store files under a single column family.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      if (familyNames != null) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        for (String familyName: familyNames) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          Object familyData = visitor.familyOpen(regionData, Bytes.toBytes(familyName));<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          monitor.rethrowException();<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>          Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          if (storeFiles == null) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>            if (LOG.isDebugEnabled()) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>              LOG.debug("No files under family: " + familyName);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            continue;<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>          // 2.1. build the snapshot reference for the store<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          // iterate through all the store's files and create "references".<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          addReferenceFiles(visitor, regionData, familyData, storeFiles, false);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>          visitor.familyClose(regionData, familyData);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      visitor.regionClose(regionData);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    } catch (IOException e) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      // the mob directory might not be created yet, so do nothing when it is a mob region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (!isMobRegion) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        throw e;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
 <span class="sourceLineNo">334</span>  }<a name="line.334"></a>
 <span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private void addReferenceFiles(RegionVisitor visitor, Object regionData, Object familyData,<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      Collection&lt;StoreFileInfo&gt; storeFiles, boolean isMob) throws IOException {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    final String fileType = isMob ? "mob file" : "hfile";<a name="line.338"></a>
+<span class="sourceLineNo">336</span>  private List&lt;StoreFileInfo&gt; getStoreFiles(Path storeDir) throws IOException {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    FileStatus[] stats = FSUtils.listStatus(rootFs, storeDir);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (stats == null) return null;<a name="line.338"></a>
 <span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (LOG.isDebugEnabled()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      LOG.debug(String.format("Adding snapshot references for %s %ss", storeFiles, fileType));<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>    int i = 0;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    int sz = storeFiles.size();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    for (StoreFileInfo storeFile: storeFiles) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      monitor.rethrowException();<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.debug(String.format("Adding reference for %s (%d/%d): %s",<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          fileType, ++i, sz, storeFile.getPath()));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>      // create "reference" to this store file.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      visitor.storeFile(regionData, familyData, storeFile);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  }<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>   * Load the information in the SnapshotManifest. Called by SnapshotManifest.open()<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   *<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * If the format is v2 and there is no data-manifest, means that we are loading an<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * in-progress snapshot. Since we support rolling-upgrades, we loook for v1 and v2<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * regions format.<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   */<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private void load() throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    switch (getSnapshotFormat(desc)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION: {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        this.htd = FSTableDescriptors.getTableDescriptorFromFs(fs, workingDir);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        try {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          this.regionManifests =<a name="line.370"></a>
-<span class="sourceLineNo">371</span>            SnapshotManifestV1.loadRegionManifests(conf, tpool, fs, workingDir, desc);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        } finally {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          tpool.shutdown();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        break;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION: {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        SnapshotDataManifest dataManifest = readDataManifest();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (dataManifest != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          htd = ProtobufUtil.toTableDescriptor(dataManifest.getTableSchema());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          regionManifests = dataManifest.getRegionManifestsList();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        } else {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          // Compatibility, load the v1 regions<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          // This happens only when the snapshot is in-progress and the cache wants to refresh.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          try {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>            v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, fs, workingDir, desc);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>            v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, fs, workingDir, desc,<a name="line.389"></a>
-<span class="sourceLineNo">390</span>                manifestSizeLimit);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          } catch (InvalidProtocolBufferException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            throw new CorruptedSnapshotException("unable to parse region manifest " +<a name="line.392"></a>
-<span class="sourceLineNo">393</span>                e.getMessage(), e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            tpool.shutdown();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          if (v1Regions != null &amp;&amp; v2Regions != null) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            regionManifests = new ArrayList&lt;&gt;(v1Regions.size() + v2Regions.size());<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            regionManifests.addAll(v1Regions);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            regionManifests.addAll(v2Regions);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          } else if (v1Regions != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            regionManifests = v1Regions;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          } else /* if (v2Regions != null) */ {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>            regionManifests = v2Regions;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        break;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      default:<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * Get the current snapshot working dir<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  public Path getSnapshotDir() {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    return this.workingDir;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  /**<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   * Get the SnapshotDescription<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public SnapshotDescription getSnapshotDescription() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    return this.desc;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * Get the table descriptor from the Snapshot<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   */<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public TableDescriptor getTableDescriptor() {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return this.htd;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>  /**<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * Get all the Region Manifest from the snapshot<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   */<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  public List&lt;SnapshotRegionManifest&gt; getRegionManifests() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    return this.regionManifests;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  /**<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * Get all the Region Manifest from the snapshot.<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * This is an helper to get a map with the region encoded name<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  public Map&lt;String, SnapshotRegionManifest&gt; getRegionManifestsMap() {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    if (regionManifests == null || regionManifests.isEmpty()) return null;<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>    HashMap&lt;String, SnapshotRegionManifest&gt; regionsMap = new HashMap&lt;&gt;(regionManifests.size());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    for (SnapshotRegionManifest manifest: regionManifests) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      String regionName = getRegionNameFromManifest(manifest);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      regionsMap.put(regionName, manifest);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return regionsMap;<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>  public void consolidate() throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    if (getSnapshotFormat(desc) == SnapshotManifestV1.DESCRIPTOR_VERSION) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      LOG.info("Using old Snapshot Format");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // write a copy of descriptor to the snapshot directory<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      new FSTableDescriptors(conf, fs, rootDir)<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        .createTableDescriptorForTableDirectory(workingDir, htd, false);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    } else {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      LOG.debug("Convert to Single Snapshot Manifest");<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      convertToV2SingleManifest();<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><a name="line.470"></a>
-<span class="sourceLineNo">471</span>  /*<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * In case of rolling-upgrade, we try to read all the formats and build<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * the snapshot with the latest format.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  private void convertToV2SingleManifest() throws IOException {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    // Try to load v1 and v2 regions<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    try {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, fs, workingDir, desc);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, fs, workingDir, desc,<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          manifestSizeLimit);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    } finally {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      tpool.shutdown();<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    SnapshotDataManifest.Builder dataManifestBuilder = SnapshotDataManifest.newBuilder();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    dataManifestBuilder.setTableSchema(ProtobufUtil.toTableSchema(htd));<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      dataManifestBuilder.addAllRegionManifests(v1Regions);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    if (v2Regions != null &amp;&amp; v2Regions.size() &gt; 0) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      dataManifestBuilder.addAllRegionManifests(v2Regions);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    // Write the v2 Data Manifest.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // Once the data-manifest is written, the snapshot can be considered complete.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    // Currently snapshots are written in a "temporary" directory and later<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    // moved to the "complated" snapshot directory.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    SnapshotDataManifest dataManifest = dataManifestBuilder.build();<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    writeDataManifest(dataManifest);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    this.regionManifests = dataManifest.getRegionManifestsList();<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    // Remove the region manifests. Everything is now in the data-manifest.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    // The delete operation is "relaxed", unless we get an exception we keep going.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    // The extra files in the snapshot directory will not give any problem,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    // since they have the same content as the data manifest, and even by re-reading<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    // them we will get the same information.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      for (SnapshotRegionManifest regionManifest: v1Regions) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        SnapshotManifestV1.deleteRegionManifest(fs, workingDir, regionManifest);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      }<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if (v2Regions != null &amp;&amp; v2Regions.size() &gt; 0) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      for (SnapshotRegionManifest regionManifest: v2Regions) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        SnapshotManifestV2.deleteRegionManifest(fs, workingDir, regionManifest);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  /*<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   * Write the SnapshotDataManifest file<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   */<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  private void writeDataManifest(final SnapshotDataManifest manifest)<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      throws IOException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    FSDataOutputStream stream = fs.create(new Path(workingDir, DATA_MANIFEST_NAME));<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    try {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      manifest.writeTo(stream);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      stream.close();<a name="line.531"></a>
+<span class="sourceLineNo">340</span>    ArrayList&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(stats.length);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    for (int i = 0; i &lt; stats.length; ++i) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      storeFiles.add(new StoreFileInfo(conf, rootFs, stats[i]));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    return storeFiles;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private void addReferenceFiles(RegionVisitor visitor, Object regionData, Object familyData,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      Collection&lt;StoreFileInfo&gt; storeFiles, boolean isMob) throws IOException {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    final String fileType = isMob ? "mob file" : "hfile";<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    if (LOG.isDebugEnabled()) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      LOG.debug(String.format("Adding snapshot references for %s %ss", storeFiles, fileType));<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span><a name="line.354"></a>
+<span class="sourceLineNo">355</span>    int i = 0;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    int sz = storeFiles.size();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    for (StoreFileInfo storeFile: storeFiles) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      monitor.rethrowException();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(String.format("Adding reference for %s (%d/%d): %s",<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          fileType, ++i, sz, storeFile.getPath()));<a name="line.361"></a>
+<span class="sourceLineNo">362</span><a name="line.362"></a>
+<span class="sourceLineNo">363</span>      // create "reference" to this store file.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      visitor.storeFile(regionData, familyData, storeFile);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>  /**<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * Load the information in the SnapshotManifest. Called by SnapshotManifest.open()<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   *<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * If the format is v2 and there is no data-manifest, means that we are loading an<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * in-progress snapshot. Since we support rolling-upgrades, we loook for v1 and v2<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * regions format.<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  private void load() throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    switch (getSnapshotFormat(desc)) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION: {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        this.htd = FSTableDescriptors.getTableDescriptorFromFs(workingDirFs, workingDir);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        try {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          this.regionManifests =<a name="line.381"></a>
+<span class="sourceLineNo">382</span>            SnapshotManifestV1.loadRegionManifests(conf, tpool, rootFs, workingDir, desc);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        } finally {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          tpool.shutdown();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        break;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION: {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        SnapshotDataManifest dataManifest = readDataManifest();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        if (dataManifest != null) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          htd = ProtobufUtil.toTableDescriptor(dataManifest.getTableSchema());<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          regionManifests = dataManifest.getRegionManifestsList();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        } else {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          // Compatibility, load the v1 regions<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          // This happens only when the snapshot is in-progress and the cache wants to refresh.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>            v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, rootFs,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                workingDir, desc);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, rootFs,<a name="line.401"></a>
+<span class="sourceLineNo">402</span>                workingDir, desc, manifestSizeLimit);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          } catch (InvalidProtocolBufferException e) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            throw new CorruptedSnapshotException("unable to parse region manifest " +<a name="line.404"></a>
+<span class="sourceLineNo">405</span>                e.getMessage(), e);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          } finally {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>            tpool.shutdown();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (v1Regions != null &amp;&amp; v2Regions != null) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            regionManifests = new ArrayList&lt;&gt;(v1Regions.size() + v2Regions.size());<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            regionManifests.addAll(v1Regions);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            regionManifests.addAll(v2Regions);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } else if (v1Regions != null) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            regionManifests = v1Regions;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          } else /* if (v2Regions != null) */ {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>            regionManifests = v2Regions;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        break;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      default:<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Get the current snapshot working dir<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  public Path getSnapshotDir() {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    return this.workingDir;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /**<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   * Get the SnapshotDescription<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public SnapshotDescription getSnapshotDescription() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return this.desc;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  /**<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * Get the table descriptor from the Snapshot<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  public TableDescriptor getTableDescriptor() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return this.htd;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * Get all the Region Manifest from the snapshot<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  public List&lt;SnapshotRegionManifest&gt; getRegionManifests() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return this.regionManifests;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * Get all the Region Manifest from the snapshot.<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   * This is an helper to get a map with the region encoded name<a name="line.457"></a>
+<span class="sourceLineNo">458</span>   */<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public Map&lt;String, SnapshotRegionManifest&gt; getRegionManifestsMap() {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    if (regionManifests == null || regionManifests.isEmpty()) return null;<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>    HashMap&lt;String, SnapshotRegionManifest&gt; regionsMap = new HashMap&lt;&gt;(regionManifests.size());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    for (SnapshotRegionManifest manifest: regionManifests) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      String regionName = getRegionNameFromManifest(manifest);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      regionsMap.put(regionName, manifest);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    }<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    return regionsMap;<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>  public void consolidate() throws IOException {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    if (getSnapshotFormat(desc) == SnapshotManifestV1.DESCRIPTOR_VERSION) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      LOG.info("Using old Snapshot Format");<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // write a copy of descriptor to the snapshot directory<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      new FSTableDescriptors(conf, workingDirFs, rootDir)<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        .createTableDescriptorForTableDirectory(workingDir, htd, false);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    } else {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      LOG.debug("Convert to Single Snapshot Manifest");<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      convertToV2SingleManifest();<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>   * In case of rolling-upgrade, we try to read all the formats and build<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   * the snapshot with the latest format.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  private void convertToV2SingleManifest() throws IOException {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    // Try to load v1 and v2 regions<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    try {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, workingDirFs,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>          workingDir, desc);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, workingDirFs,<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          workingDir, desc, manifestSizeLimit);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    } finally {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      tpool.shutdown();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>    SnapshotDataManifest.Builder dataManifestBuilder = SnapshotDataManifest.newBuilder();<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    dataManifestBuilder.setTableSchema(ProtobufUtil.toTableSchema(htd));<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      dataManifestBuilder.addAllRegionManifests(v1Regions);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    if (v2Regions != null &amp;&amp; v2Regions.size() &gt; 0) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      dataManifestBuilder.addAllRegionManifests(v2Regions);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span><a name="line.509"></a>
+<span class="sourceLineNo">510</span>    // Write the v2 Data Manifest.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    // Once the data-manifest is written, the snapshot can be considered complete.<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    // Currently snapshots are written in a "temporary" directory and later<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    // moved to the "complated" snapshot directory.<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    SnapshotDataManifest dataManifest = dataManifestBuilder.build();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    writeDataManifest(dataManifest);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    this.regionManifests = dataManifest.getRegionManifestsList();<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    // Remove the region manifests. Everything is now in the data-manifest.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    // The delete operation is "relaxed", unless we get an exception we keep going.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    // The extra files in the snapshot directory will not give any problem,<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // since they have the same content as the data manifest, and even by re-reading<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    // them we will get the same information.<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      for (S

<TRUNCATED>

[44/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
index d6b1e65..387c5e5 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
@@ -158,7 +158,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.snapshot.<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#conf">conf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#fs">fs</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#htd">htd</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#master">master</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#metricsSnapshot">metricsSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#monitor">monitor</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootDir">rootDir</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshot">snapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.
 html#snapshotManager">snapshotManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotManifest">snapshotManifest</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotTable">snapshotTable</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#status">status</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#tableLock">tableLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDir">workingDir</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#conf">conf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#htd">htd</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#master">master</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#metricsSnapshot">metricsSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#monitor">monitor</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootDir">rootDir</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootFs">rootFs</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshot">snapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshot
 Handler.html#snapshotManager">snapshotManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotManifest">snapshotManifest</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotTable">snapshotTable</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#status">status</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#tableLock">tableLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDir">workingDir</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDirFs">workingDirFs</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.executor.EventHandler">
@@ -220,7 +220,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.snapshot.<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#cancel-java.lang.String-">cancel</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getException--">getException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getExceptionIfFailed--">getExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getSnapshot--">getSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#hasException--
 ">hasException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#isFinished--">isFinished</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#process--">process</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowException--">rethrowException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowExceptionIfFailed--">rethrowExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotDisabledRegion-org.apache.hadoop.hbase.client.RegionInfo-">snapshotDisabledRegion</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#cancel-java.lang.String-">cancel</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getException--">getException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getExceptionIfFailed--">getExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getSnapshot--">getSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSna
 pshotHandler.html#hasException--">hasException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#isFinished--">isFinished</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#process--">process</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowException--">rethrowException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowExceptionIfFailed--">rethrowExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotDisabledRegion-org.apache.hadoop.hbase.client.RegionInfo-">snapshotDisabledRegion</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.executor.EventHandler">
@@ -273,13 +273,17 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DisabledTableSnapshotHandler</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html#line.58">DisabledTableSnapshotHandler</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html#line.60">DisabledTableSnapshotHandler</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                     <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices,
-                                    <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;snapshotManager)</pre>
+                                    <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;snapshotManager)
+                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>snapshot</code> - descriptor of the snapshot to take</dd>
 <dd><code>masterServices</code> - master services provider</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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 it cannot access the filesystem of the snapshot
+         temporary directory</dd>
 </dl>
 </li>
 </ul>
@@ -297,7 +301,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <ul class="blockList">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">DisabledTableSnapshotHandler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html#line.64">prepare</a>()
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">DisabledTableSnapshotHandler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html#line.67">prepare</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/executor/EventHandler.html#prepare--">EventHandler</a></code></span></div>
 <div class="block">Event handlers should do all the necessary checks in this method (rather than
@@ -321,7 +325,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <ul class="blockListLast">
 <li class="blockList">
 <h4>snapshotRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html#line.71">snapshotRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regionsAndLocations)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html#line.74">snapshotRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regionsAndLocations)
                      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>,
                             org.apache.zookeeper.KeeperException</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotRegions-java.util.List-">TakeSnapshotHandler</a></code></span></div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
index b735721..4d9e7b1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
@@ -164,7 +164,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.master.snapshot.<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#conf">conf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#fs">fs</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#htd">htd</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#master">master</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#metricsSnapshot">metricsSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#monitor">monitor</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootDir">rootDir</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshot">snapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.
 html#snapshotManager">snapshotManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotManifest">snapshotManifest</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotTable">snapshotTable</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#status">status</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#tableLock">tableLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDir">workingDir</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#conf">conf</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#htd">htd</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#master">master</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#metricsSnapshot">metricsSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#monitor">monitor</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootDir">rootDir</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootFs">rootFs</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshot">snapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshot
 Handler.html#snapshotManager">snapshotManager</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotManifest">snapshotManifest</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotTable">snapshotTable</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#status">status</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#tableLock">tableLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDir">workingDir</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDirFs">workingDirFs</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.executor.EventHandler">
@@ -232,7 +232,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.master.snapshot.<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#cancel-java.lang.String-">cancel</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getException--">getException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getExceptionIfFailed--">getExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getSnapshot--">getSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#hasException--
 ">hasException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#isFinished--">isFinished</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#process--">process</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowException--">rethrowException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowExceptionIfFailed--">rethrowExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotDisabledRegion-org.apache.hadoop.hbase.client.RegionInfo-">snapshotDisabledRegion</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#cancel-java.lang.String-">cancel</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getCompletionTimestamp--">getCompletionTimestamp</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getException--">getException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getExceptionIfFailed--">getExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#getSnapshot--">getSnapshot</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSna
 pshotHandler.html#hasException--">hasException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#isFinished--">isFinished</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#process--">process</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowException--">rethrowException</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rethrowExceptionIfFailed--">rethrowExceptionIfFailed</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotDisabledRegion-org.apache.hadoop.hbase.client.RegionInfo-">snapshotDisabledRegion</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.executor.EventHandler">
@@ -296,7 +296,12 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeS
 <h4>EnabledTableSnapshotHandler</h4>
 <pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html#line.52">EnabledTableSnapshotHandler</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                    <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,
-                                   <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;manager)</pre>
+                                   <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;manager)
+                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
index 3e32beb..edb77a1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
@@ -111,7 +111,7 @@ var activeTableTab = "activeTableTab";
 <br>
 <pre>@InterfaceAudience.Private
  @InterfaceStability.Unstable
-public final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.78">MasterSnapshotVerifier</a>
+public final class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.79">MasterSnapshotVerifier</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">General snapshot verification on the master.
  <p>
@@ -158,17 +158,9 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#fs">fs</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><code>private org.apache.hadoop.fs.Path</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#rootDir">rootDir</a></span></code>&nbsp;</td>
-</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#services">services</a></span></code>&nbsp;</td>
@@ -181,6 +173,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colFirst"><code>private <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/master/snapshot/MasterSnapshotVerifier.html#tableName">tableName</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#workingDirFs">workingDirFs</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -196,9 +192,9 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">MasterSnapshotVerifier</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services,
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.FileSystem-">MasterSnapshotVerifier</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services,
                       org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
-                      org.apache.hadoop.fs.Path&nbsp;rootDir)</code>&nbsp;</td>
+                      org.apache.hadoop.fs.FileSystem&nbsp;workingDirFs)</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -275,7 +271,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.79">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.80">LOG</a></pre>
 </li>
 </ul>
 <a name="snapshot">
@@ -284,25 +280,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.81">snapshot</a></pre>
-</li>
-</ul>
-<a name="fs">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>fs</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.82">fs</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.82">snapshot</a></pre>
 </li>
 </ul>
-<a name="rootDir">
+<a name="workingDirFs">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>rootDir</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.83">rootDir</a></pre>
+<h4>workingDirFs</h4>
+<pre>private&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.83">workingDirFs</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -331,7 +318,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">
+<a name="MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.FileSystem-">
 <!--   -->
 </a>
 <ul class="blockListLast">
@@ -339,12 +326,12 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <h4>MasterSnapshotVerifier</h4>
 <pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.92">MasterSnapshotVerifier</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services,
                               org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
-                              org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+                              org.apache.hadoop.fs.FileSystem&nbsp;workingDirFs)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>services</code> - services for the master</dd>
 <dd><code>snapshot</code> - snapshot to check</dd>
-<dd><code>rootDir</code> - root directory of the hbase installation.</dd>
+<dd><code>workingDirFs</code> - the file system containing the temporary snapshot information</dd>
 </dl>
 </li>
 </ul>
@@ -401,7 +388,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyTableInfo</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.139">verifyTableInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;manifest)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.140">verifyTableInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;manifest)
                       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">Check that the table descriptor for the snapshot is a valid table descriptor</div>
 <dl>
@@ -418,7 +405,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyRegions</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.158">verifyRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;manifest)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.159">verifyRegions</a>(<a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;manifest)
                     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">Check that all the regions in the snapshot are valid, and accounted for.</div>
 <dl>
@@ -435,7 +422,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>verifyRegionInfo</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.217">verifyRegionInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#line.220">verifyRegionInfo</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region,
                               org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)
                        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">Verify that the regionInfo is valid</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
index cc6116d..d60b322 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
@@ -960,14 +960,15 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotDisabledTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.484">snapshotDisabledTable</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
-                            throws <a href="../../../../../../org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.html" title="class in org.apache.hadoop.hbase.snapshot">HBaseSnapshotException</a></pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.485">snapshotDisabledTable</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
+                            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">Take a snapshot of a disabled table.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>snapshot</code> - description of the snapshot to take. Modified to be <code>SnapshotProtos.SnapshotDescription.Type.DISABLED</code>.</dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.html" title="class in org.apache.hadoop.hbase.snapshot">HBaseSnapshotException</a></code> - if the snapshot could not be started</dd>
+<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 the snapshot could not be started or filesystem for snapshot
+         temporary directory could not be determined</dd>
 </dl>
 </li>
 </ul>
@@ -977,14 +978,15 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotEnabledTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.503">snapshotEnabledTable</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
-                           throws <a href="../../../../../../org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.html" title="class in org.apache.hadoop.hbase.snapshot">HBaseSnapshotException</a></pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.505">snapshotEnabledTable</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
+                           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">Take a snapshot of an enabled table.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>snapshot</code> - description of the snapshot to take.</dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.html" title="class in org.apache.hadoop.hbase.snapshot">HBaseSnapshotException</a></code> - if the snapshot could not be started</dd>
+<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 the snapshot could not be started or filesystem for snapshot
+         temporary directory could not be determined</dd>
 </dl>
 </li>
 </ul>
@@ -994,9 +996,9 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.522">snapshotTable</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.524">snapshotTable</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                            <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a>&nbsp;handler)
-                    throws <a href="../../../../../../org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.html" title="class in org.apache.hadoop.hbase.snapshot">HBaseSnapshotException</a></pre>
+                    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">Take a snapshot using the specified handler.
  On failure the snapshot temporary working directory is removed.
  NOTE: prepareToTakeSnapshot() called before this one takes care of the rejecting the
@@ -1006,7 +1008,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <dd><code>snapshot</code> - the snapshot description</dd>
 <dd><code>handler</code> - the snapshot handler</dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.html" title="class in org.apache.hadoop.hbase.snapshot">HBaseSnapshotException</a></code></dd>
+<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></dd>
 </dl>
 </li>
 </ul>
@@ -1016,7 +1018,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>takeSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.553">takeSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.557">takeSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
                   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">Take a snapshot based on the enabled/disabled state of the table.</div>
 <dl>
@@ -1034,7 +1036,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>setSnapshotHandlerForTesting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.643">setSnapshotHandlerForTesting</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.647">setSnapshotHandlerForTesting</a>(<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/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>&nbsp;handler)</pre>
 <div class="block">Set the handler for the current snapshot
  <p>
@@ -1054,7 +1056,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoordinator</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/procedure/ProcedureCoordinator.html" title="class in org.apache.hadoop.hbase.procedure">ProcedureCoordinator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.656">getCoordinator</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/procedure/ProcedureCoordinator.html" title="class in org.apache.hadoop.hbase.procedure">ProcedureCoordinator</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.660">getCoordinator</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>distributed commit coordinator for all running snapshots</dd>
@@ -1067,7 +1069,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isSnapshotCompleted</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.670">isSnapshotCompleted</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.674">isSnapshotCompleted</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
                              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">Check to see if the snapshot is one of the currently completed snapshots
  Returns true if the snapshot exists in the "completed snapshots folder".</div>
@@ -1089,7 +1091,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneSnapshot</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.693">cloneSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;reqSnapshot,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.697">cloneSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;reqSnapshot,
                            <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                            org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                            <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;snapshotTableDesc,
@@ -1118,7 +1120,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>cloneSnapshot</h4>
-<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.728">cloneSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.732">cloneSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                    <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/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey,
                    boolean&nbsp;restoreAcl)
@@ -1143,7 +1145,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreOrCloneSnapshot</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.764">restoreOrCloneSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;reqSnapshot,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.768">restoreOrCloneSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;reqSnapshot,
                                    <a href="../../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey,
                                    boolean&nbsp;restoreAcl)
                             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>
@@ -1163,7 +1165,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreSnapshot</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.815">restoreSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;reqSnapshot,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.819">restoreSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;reqSnapshot,
                              <a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                              <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;snapshotTableDesc,
@@ -1193,7 +1195,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreSnapshot</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.860">restoreSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.864">restoreSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                              <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/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey,
                              boolean&nbsp;restoreAcl)
@@ -1219,7 +1221,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isRestoringTable</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.897">isRestoringTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.901">isRestoringTable</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Verify if the restore of the specified table is in progress.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1235,7 +1237,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>removeSentinelIfFinished</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.919">removeSentinelIfFinished</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>&gt;&nbsp;sentinels,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.923">removeSentinelIfFinished</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>&gt;&nbsp;sentinels,
                                                   org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</pre>
 <div class="block">Return the handler if it is currently live and has the same snapshot target name.
  The handler is removed from the sentinels map if completed.</div>
@@ -1254,7 +1256,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupSentinels</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.952">cleanupSentinels</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.956">cleanupSentinels</a>()</pre>
 <div class="block">Removes "abandoned" snapshot/restore requests.
  As part of the HBaseAdmin snapshot/restore API the operation status is checked until completed,
  and the in-progress maps are cleaned up when the status of a completed task is requested.
@@ -1268,7 +1270,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupSentinels</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.962">cleanupSentinels</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>&gt;&nbsp;sentinels)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.966">cleanupSentinels</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>&gt;&nbsp;sentinels)</pre>
 <div class="block">Remove the sentinels that are marked as finished and the completion time
  has exceeded the removal timeout.</div>
 <dl>
@@ -1283,7 +1285,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupCompletedRestoreInMap</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.980">cleanupCompletedRestoreInMap</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.984">cleanupCompletedRestoreInMap</a>()</pre>
 <div class="block">Remove the procedures that are marked as finished</div>
 </li>
 </ul>
@@ -1293,7 +1295,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.997">stop</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;why)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1001">stop</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;why)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#stop-java.lang.String-">Stoppable</a></code></span></div>
 <div class="block">Stop this service.
  Implementers should favor logging errors over throwing RuntimeExceptions.</div>
@@ -1311,7 +1313,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1017">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1021">isStopped</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#isStopped--">isStopped</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></code></dd>
@@ -1326,7 +1328,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>checkSnapshotSupport</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1026">checkSnapshotSupport</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1030">checkSnapshotSupport</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/UnsupportedOperationException.html?is-external=true" title="class or interface in java.lang">UnsupportedOperationException</a></pre>
 <div class="block">Throws an exception if snapshot operations (take a snapshot, restore, clone) are not supported.
  Called at the beginning of snapshot() and restoreSnapshot() methods.</div>
@@ -1342,7 +1344,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>checkSnapshotSupport</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1044">checkSnapshotSupport</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1048">checkSnapshotSupport</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                   <a href="../../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a>&nbsp;mfs)
                            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/UnsupportedOperationException.html?is-external=true" title="class or interface in java.lang">UnsupportedOperationException</a></pre>
@@ -1366,7 +1368,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1116">initialize</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1120">initialize</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,
                        <a href="../../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a>&nbsp;metricsMaster)
                 throws org.apache.zookeeper.KeeperException,
                        <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>,
@@ -1391,7 +1393,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureSignature</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/master/snapshot/SnapshotManager.html#line.1144">getProcedureSignature</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/master/snapshot/SnapshotManager.html#line.1148">getProcedureSignature</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure/ProcedureManager.html#getProcedureSignature--">ProcedureManager</a></code></span></div>
 <div class="block">Return the unique signature of the procedure. This signature uniquely
  identifies the procedure. By default, this signature is the string used in
@@ -1408,7 +1410,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>execProcedure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1149">execProcedure</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1153">execProcedure</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManager.html#execProcedure-org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription-">MasterProcedureManager</a></code></span></div>
 <div class="block">Execute a distributed procedure on cluster</div>
@@ -1428,7 +1430,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>checkPermissions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1154">checkPermissions</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1158">checkPermissions</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc,
                              <a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessChecker.html" title="class in org.apache.hadoop.hbase.security.access">AccessChecker</a>&nbsp;accessChecker,
                              <a href="../../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
                       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>
@@ -1448,7 +1450,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isProcedureDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1161">isProcedureDone</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1165">isProcedureDone</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManager.html#isProcedureDone-org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription-">MasterProcedureManager</a></code></span></div>
 <div class="block">Check if the procedure is finished successfully</div>
@@ -1470,7 +1472,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>toSnapshotDescription</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1165">toSnapshotDescription</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc)
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1169">toSnapshotDescription</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc)
                                                                                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1484,7 +1486,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getLocks</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</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>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1189">getLocks</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</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>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1193">getLocks</a>()</pre>
 </li>
 </ul>
 </li>


[40/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
index fca0402..fa25ee7 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
@@ -167,29 +167,29 @@ 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/snapshot/SnapshotManifest.html#desc">desc</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#fs">fs</a></span></code>&nbsp;</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#htd">htd</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#manifestSizeLimit">manifestSizeLimit</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#monitor">monitor</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#regionManifests">regionManifests</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#rootFs">rootFs</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#SNAPSHOT_MANIFEST_SIZE_LIMIT_CONF_KEY">SNAPSHOT_MANIFEST_SIZE_LIMIT_CONF_KEY</a></span></code>&nbsp;</td>
@@ -198,6 +198,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colFirst"><code>private org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#workingDir">workingDir</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#workingDirFs">workingDirFs</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -216,7 +220,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <tr class="altColor">
 <td class="colFirst"><code>private </code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#SnapshotManifest-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.errorhandling.ForeignExceptionSnare-">SnapshotManifest</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
-                org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                org.apache.hadoop.fs.FileSystem&nbsp;rootFs,
                 org.apache.hadoop.fs.Path&nbsp;workingDir,
                 org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc,
                 <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;monitor)</code>&nbsp;</td>
@@ -492,13 +496,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.83">workingDir</a></pre>
 </li>
 </ul>
-<a name="fs">
+<a name="rootFs">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>rootFs</h4>
+<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.84">rootFs</a></pre>
+</li>
+</ul>
+<a name="workingDirFs">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>fs</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.84">fs</a></pre>
+<h4>workingDirFs</h4>
+<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.85">workingDirFs</a></pre>
 </li>
 </ul>
 <a name="manifestSizeLimit">
@@ -507,7 +520,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>manifestSizeLimit</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.85">manifestSizeLimit</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.86">manifestSizeLimit</a></pre>
 </li>
 </ul>
 </li>
@@ -524,11 +537,23 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SnapshotManifest</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.87">SnapshotManifest</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
-                         org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.98">SnapshotManifest</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+                         org.apache.hadoop.fs.FileSystem&nbsp;rootFs,
                          org.apache.hadoop.fs.Path&nbsp;workingDir,
                          org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc,
-                         <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;monitor)</pre>
+                         <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;monitor)
+                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>conf</code> - configuration file for HBase setup</dd>
+<dd><code>rootFs</code> - root filesystem containing HFiles</dd>
+<dd><code>workingDir</code> - file path of where the manifest should be located</dd>
+<dd><code>desc</code> - description of snapshot being taken</dd>
+<dd><code>monitor</code> - monitor of foreign exceptions</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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 the working directory file system cannot be
+                     determined from the config file</dd>
+</dl>
 </li>
 </ul>
 </li>
@@ -545,11 +570,12 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>create</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.112">create</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.123">create</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                       org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                       org.apache.hadoop.fs.Path&nbsp;workingDir,
                                       org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc,
-                                      <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;monitor)</pre>
+                                      <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;monitor)
+                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Return a SnapshotManifest instance, used for writing a snapshot.
 
  There are two usage pattern:
@@ -561,6 +587,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
   - The RegionServer will create a single region manifest
       manifest = SnapshotManifest.create(...)
       manifest.addRegion(region)</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
 </li>
 </ul>
 <a name="open-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">
@@ -569,7 +599,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>open</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.128">open</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.139">open</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                     org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                     org.apache.hadoop.fs.Path&nbsp;workingDir,
                                     org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc)
@@ -593,7 +623,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addTableDescriptor</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.139">addTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.150">addTableDescriptor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Add the table descriptor to the snapshot manifest</div>
 <dl>
@@ -608,7 +638,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionVisitor</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.154">createRegionVisitor</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.165">createRegionVisitor</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc)
                                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -622,7 +652,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addMobRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.166">addMobRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.177">addMobRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -636,7 +666,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addMobRegion</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.175">addMobRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.186">addMobRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                             <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&nbsp;visitor)
                      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>
@@ -651,7 +681,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.213">addRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.224">addRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
                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">Creates a 'manifest' for the specified region, by reading directly from the HRegion object.
  This is used by the "online snapshot" when the table is enabled.</div>
@@ -667,7 +697,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegion</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.222">addRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.233">addRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                          <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&nbsp;visitor)
                   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>
@@ -682,7 +712,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.260">addRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.271">addRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                       <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
                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">Creates a 'manifest' for the specified region, by reading directly from the disk.
@@ -699,7 +729,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegion</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.269">addRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.280">addRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                          <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                          <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&nbsp;visitor)
                   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>
@@ -715,7 +745,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFiles</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.325">getStoreFiles</a>(org.apache.hadoop.fs.Path&nbsp;storeDir)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.336">getStoreFiles</a>(org.apache.hadoop.fs.Path&nbsp;storeDir)
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -729,7 +759,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addReferenceFiles</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.336">addReferenceFiles</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&nbsp;visitor,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.347">addReferenceFiles</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&nbsp;visitor,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;regionData,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;familyData,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;storeFiles,
@@ -747,7 +777,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.364">load</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.375">load</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">Load the information in the SnapshotManifest. Called by SnapshotManifest.open()
 
@@ -766,7 +796,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.418">getSnapshotDir</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.430">getSnapshotDir</a>()</pre>
 <div class="block">Get the current snapshot working dir</div>
 </li>
 </ul>
@@ -776,7 +806,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotDescription</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.425">getSnapshotDescription</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.437">getSnapshotDescription</a>()</pre>
 <div class="block">Get the SnapshotDescription</div>
 </li>
 </ul>
@@ -786,7 +816,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.432">getTableDescriptor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.444">getTableDescriptor</a>()</pre>
 <div class="block">Get the table descriptor from the Snapshot</div>
 </li>
 </ul>
@@ -796,7 +826,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionManifests</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.439">getRegionManifests</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.451">getRegionManifests</a>()</pre>
 <div class="block">Get all the Region Manifest from the snapshot</div>
 </li>
 </ul>
@@ -806,7 +836,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionManifestsMap</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.447">getRegionManifestsMap</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.459">getRegionManifestsMap</a>()</pre>
 <div class="block">Get all the Region Manifest from the snapshot.
  This is an helper to get a map with the region encoded name</div>
 </li>
@@ -817,7 +847,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>consolidate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.458">consolidate</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.470">consolidate</a>()
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -831,7 +861,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convertToV2SingleManifest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.475">convertToV2SingleManifest</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.487">convertToV2SingleManifest</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -845,7 +875,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeDataManifest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.525">writeDataManifest</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDataManifest&nbsp;manifest)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.538">writeDataManifest</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDataManifest&nbsp;manifest)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -859,7 +889,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readDataManifest</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDataManifest&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.538">readDataManifest</a>()
+<pre>private&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDataManifest&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.551">readDataManifest</a>()
                                                                                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -873,7 +903,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createExecutor</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.554">createExecutor</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.567">createExecutor</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="createExecutor-org.apache.hadoop.conf.Configuration-java.lang.String-">
@@ -882,7 +912,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createExecutor</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.558">createExecutor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.571">createExecutor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 </li>
 </ul>
@@ -892,7 +922,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionNameFromManifest</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.567">getRegionNameFromManifest</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)</pre>
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.580">getRegionNameFromManifest</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)</pre>
 <div class="block">Extract the region encoded name from the region manifest</div>
 </li>
 </ul>
@@ -902,7 +932,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getSnapshotFormat</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.578">getSnapshotFormat</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc)</pre>
+<pre>private static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.591">getSnapshotFormat</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
index 357051c..5a2183a 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
@@ -144,12 +144,16 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#fs">fs</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#rootFs">rootFs</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#snapshotDir">snapshotDir</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#workingDirFs">workingDirFs</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -166,7 +170,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 </tr>
 <tr class="altColor">
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#ManifestBuilder-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">ManifestBuilder</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
-               org.apache.hadoop.fs.FileSystem&nbsp;fs,
+               org.apache.hadoop.fs.FileSystem&nbsp;rootFs,
                org.apache.hadoop.fs.Path&nbsp;snapshotDir)</code>&nbsp;</td>
 </tr>
 </table>
@@ -248,13 +252,22 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.69">snapshotDir</a></pre>
 </li>
 </ul>
-<a name="fs">
+<a name="rootFs">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>rootFs</h4>
+<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.70">rootFs</a></pre>
+</li>
+</ul>
+<a name="workingDirFs">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>fs</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.70">fs</a></pre>
+<h4>workingDirFs</h4>
+<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.71">workingDirFs</a></pre>
 </li>
 </ul>
 </li>
@@ -271,9 +284,14 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ManifestBuilder</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.72">ManifestBuilder</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
-                       org.apache.hadoop.fs.FileSystem&nbsp;fs,
-                       org.apache.hadoop.fs.Path&nbsp;snapshotDir)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.73">ManifestBuilder</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+                       org.apache.hadoop.fs.FileSystem&nbsp;rootFs,
+                       org.apache.hadoop.fs.Path&nbsp;snapshotDir)
+                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
 </li>
 </ul>
 </li>
@@ -290,7 +308,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOpen</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.79">regionOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.82">regionOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -306,7 +324,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>regionClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.86">regionClose</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;region)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.89">regionClose</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;region)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#regionClose-TRegion-">regionClose</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>,org.apache.hadoop.fs.Path&gt;</code></dd>
@@ -319,7 +337,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>familyOpen</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.90">familyOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;snapshotRegionFs,
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.93">familyOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;snapshotRegionFs,
                                             byte[]&nbsp;familyName)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -333,7 +351,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>familyClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.96">familyClose</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.99">familyClose</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;region,
                         org.apache.hadoop.fs.Path&nbsp;family)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -347,7 +365,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockListLast">
 <li class="blockList">
 <h4>storeFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.100">storeFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#line.103">storeFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;region,
                       org.apache.hadoop.fs.Path&nbsp;familyDir,
                       <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;storeFile)
                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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
index e29322a..af3dcf5 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
@@ -294,7 +294,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>loadRegionManifests</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html#line.120">loadRegionManifests</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html#line.123">loadRegionManifests</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                                                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html?is-external=true" title="class or interface in java.util.concurrent">Executor</a>&nbsp;executor,
                                                                                                                          org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                                                                                          org.apache.hadoop.fs.Path&nbsp;snapshotDir,
@@ -312,7 +312,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteRegionManifest</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html#line.156">deleteRegionManifest</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html#line.159">deleteRegionManifest</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                  org.apache.hadoop.fs.Path&nbsp;snapshotDir,
                                  org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)
                           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>
@@ -328,7 +328,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>buildManifestFromDisk</h4>
-<pre>static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html#line.162">buildManifestFromDisk</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html#line.165">buildManifestFromDisk</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                                                                      org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                                                                                      org.apache.hadoop.fs.Path&nbsp;tableDir,
                                                                                                                      <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
index 0198f80..60bfc4a 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
@@ -144,7 +144,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.fs.FileSystem</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#fs">fs</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#rootFs">rootFs</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.fs.Path</code></td>
@@ -166,7 +166,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 </tr>
 <tr class="altColor">
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#ManifestBuilder-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">ManifestBuilder</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
-               org.apache.hadoop.fs.FileSystem&nbsp;fs,
+               org.apache.hadoop.fs.FileSystem&nbsp;rootFs,
                org.apache.hadoop.fs.Path&nbsp;snapshotDir)</code>&nbsp;</td>
 </tr>
 </table>
@@ -248,13 +248,13 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.71">snapshotDir</a></pre>
 </li>
 </ul>
-<a name="fs">
+<a name="rootFs">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>fs</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.72">fs</a></pre>
+<h4>rootFs</h4>
+<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.72">rootFs</a></pre>
 </li>
 </ul>
 </li>
@@ -272,7 +272,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <li class="blockList">
 <h4>ManifestBuilder</h4>
 <pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.74">ManifestBuilder</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
-                       org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                       org.apache.hadoop.fs.FileSystem&nbsp;rootFs,
                        org.apache.hadoop.fs.Path&nbsp;snapshotDir)</pre>
 </li>
 </ul>
@@ -290,7 +290,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOpen</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.81">regionOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.82">regionOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#regionOpen-org.apache.hadoop.hbase.client.RegionInfo-">regionOpen</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="interface in org.apache.hadoop.hbase.snapshot">SnapshotManifest.RegionVisitor</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder,org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.FamilyFiles.Builder&gt;</code></dd>
@@ -303,7 +303,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>regionClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.88">regionClose</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.89">regionClose</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -319,7 +319,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>familyOpen</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.FamilyFiles.Builder&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.105">familyOpen</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region,
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.FamilyFiles.Builder&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.108">familyOpen</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region,
                                                                                                                               byte[]&nbsp;familyName)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -333,7 +333,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockList">
 <li class="blockList">
 <h4>familyClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.114">familyClose</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.117">familyClose</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region,
                         org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.FamilyFiles.Builder&nbsp;family)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -347,7 +347,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotMani
 <ul class="blockListLast">
 <li class="blockList">
 <h4>storeFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.120">storeFile</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#line.123">storeFile</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.Builder&nbsp;region,
                       org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest.FamilyFiles.Builder&nbsp;family,
                       <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;storeFile)
                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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
index 3447b61..1e78dda 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
@@ -309,7 +309,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>loadRegionManifests</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html#line.134">loadRegionManifests</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html#line.137">loadRegionManifests</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                                                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html?is-external=true" title="class or interface in java.util.concurrent">Executor</a>&nbsp;executor,
                                                                                                                          org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                                                                                          org.apache.hadoop.fs.Path&nbsp;snapshotDir,
@@ -328,7 +328,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteRegionManifest</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html#line.186">deleteRegionManifest</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html#line.189">deleteRegionManifest</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                  org.apache.hadoop.fs.Path&nbsp;snapshotDir,
                                  org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)
                           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>
@@ -344,7 +344,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRegionManifestPath</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html#line.191">getRegionManifestPath</a>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
+<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html#line.194">getRegionManifestPath</a>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
                                                                org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest&nbsp;manifest)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/HBaseSnapshotException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/HBaseSnapshotException.html b/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/HBaseSnapshotException.html
index afe91fa..4906656 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/HBaseSnapshotException.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/HBaseSnapshotException.html
@@ -161,30 +161,11 @@
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private void</code></td>
-<td class="colLast"><span class="typeNameLabel">SnapshotManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#snapshotDisabledTable-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">snapshotDisabledTable</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</code>
-<div class="block">Take a snapshot of a disabled table.</div>
-</td>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><code>private void</code></td>
-<td class="colLast"><span class="typeNameLabel">SnapshotManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#snapshotEnabledTable-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">snapshotEnabledTable</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</code>
-<div class="block">Take a snapshot of an enabled table.</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><span class="typeNameLabel">EnabledTableSnapshotHandler.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html#snapshotRegions-java.util.List-">snapshotRegions</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regions)</code>
 <div class="block">This method kicks off a snapshot procedure.</div>
 </td>
 </tr>
-<tr class="altColor">
-<td class="colFirst"><code>private void</code></td>
-<td class="colLast"><span class="typeNameLabel">SnapshotManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#snapshotTable-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.master.snapshot.TakeSnapshotHandler-">snapshotTable</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
-             <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a>&nbsp;handler)</code>
-<div class="block">Take a snapshot using the specified handler.</div>
-</td>
-</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/SnapshotCreationException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/SnapshotCreationException.html b/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/SnapshotCreationException.html
index 43d17b3..e5c7f25 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/SnapshotCreationException.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/class-use/SnapshotCreationException.html
@@ -196,10 +196,11 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><span class="typeNameLabel">TakeSnapshotHandler.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a></span>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
+<td class="colLast"><span class="typeNameLabel">TakeSnapshotHandler.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a></span>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
                 org.apache.hadoop.fs.Path&nbsp;workingDir,
-                org.apache.hadoop.fs.FileSystem&nbsp;fs)</code>
-<div class="block">Reset the manager to allow another snapshot to proceed</div>
+                org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                org.apache.hadoop.fs.FileSystem&nbsp;workingDirFs)</code>
+<div class="block">Reset the manager to allow another snapshot to proceed.</div>
 </td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index c4d41b0..c0606ee 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -515,14 +515,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 865d5f6..117a619 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "2ab8122a24eb8444c2804b7f980bf008f395933d";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "3810ba2c6edfc531181ffc9e6c68396a0c2d2027";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Tue Sep 11 14:45:27 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Wed Sep 12 14:44:52 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "15a756b17eed0c34f46a577d4852d9ca";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "18f0f49c83fb2fc12ae90317ce7e2e9f";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[08/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  private final String family = "f

<TRUNCATED>

[21/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index d5b615b..491160c 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -891,6 +891,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#admin">admin</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#admin">admin</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html#admin">admin</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableFavoredNodes.html#admin">admin</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableFavoredNodes.html" title="class in org.apache.hadoop.hbase.client">TestTableFavoredNodes</a></dt>
@@ -4483,6 +4485,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotCloneIndependence</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromAdmin</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></dt>
@@ -4491,6 +4495,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.html" title="class in org.apache.hadoop.hbase.client">TestSplitOrMergeStatus</a></dt>
@@ -6181,6 +6189,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotNoCluster</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestFlushSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobExportSnapshot</a></dt>
@@ -6789,6 +6799,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#cleanupTest--">cleanupTest()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#cleanupTest--">cleanupTest()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestMasterAbortWhileMergingTable.html#cleanupTest--">cleanupTest()</a></span> - Static method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestMasterAbortWhileMergingTable.html" title="class in org.apache.hadoop.hbase.master.assignment">TestMasterAbortWhileMergingTable</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestMergeTableRegionsProcedure.html#cleanupTest--">cleanupTest()</a></span> - Static method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestMergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TestMergeTableRegionsProcedure</a></dt>
@@ -7479,6 +7491,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html#COLUMN_COUNT">COLUMN_COUNT</a></span> - Static variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#COLUMN_EMPTY">COLUMN_EMPTY</a></span> - Static variable in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestTableScan.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSmallReversedScanner.html#COLUMN_FAMILY">COLUMN_FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSmallReversedScanner.html" title="class in org.apache.hadoop.hbase.client">TestSmallReversedScanner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/TestColumnPaginationFilter.html#COLUMN_FAMILY">COLUMN_FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/TestColumnPaginationFilter.html" title="class in org.apache.hadoop.hbase.filter">TestColumnPaginationFilter</a></dt>
@@ -10784,6 +10798,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.html#createWALKey-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.HRegionInfo-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-">createWALKey(TableName, HRegionInfo, MultiVersionConcurrencyControl, NavigableMap&lt;byte[], Integer&gt;)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractTestWALReplay</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#createWALProcedureStore-org.apache.hadoop.conf.Configuration-">createWALProcedureStore(Configuration)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.html#createWALReaderForPrimary--">createWALReaderForPrimary()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegionReplayEvents</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseTestingUtility.html#createWALRootDir--">createWALRootDir()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></dt>
@@ -11068,6 +11084,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.html#data">data</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.html" title="class in org.apache.hadoop.hbase.client">TestBlockEvictionFromClient</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html" title="class in org.apache.hadoop.hbase.io.asyncfs">TestSaslFanOutOneBlockAsyncDFSOutput</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.io.hfile.bucket.<a href="org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.html" title="class in org.apache.hadoop.hbase.io.hfile.bucket">TestBucketCache</a></dt>
@@ -13514,6 +13532,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#expectedRows2">expectedRows2</a></span> - Static variable in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestTableScan.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#expectedRows3">expectedRows3</a></span> - Static variable in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestTableScan.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestFileSystemUtilizationChore.ExpectedRegionSizeSummationAnswer.html#expectedSize">expectedSize</a></span> - Variable in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestFileSystemUtilizationChore.ExpectedRegionSizeSummationAnswer.html" title="class in org.apache.hadoop.hbase.quotas">TestFileSystemUtilizationChore.ExpectedRegionSizeSummationAnswer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.html#expectedVisString">expectedVisString</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.html" title="class in org.apache.hadoop.hbase.security.visibility">TestVisibilityLabelsReplication</a></dt>
@@ -17620,6 +17640,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClientWithRegionReplicas.html#getNumReplicas--">getNumReplicas()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClientWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClientWithRegionReplicas</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#getNumReplicas--">getNumReplicas()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#getNumReplicas--">getNumReplicas()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestCloneSnapshotProcedure.html#getNumReplicas--">getNumReplicas()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestCloneSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestCloneSnapshotProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#getNumReplicas--">getNumReplicas()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></dt>
@@ -23417,6 +23441,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TestTableDescriptorBuilder</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableFavoredNodes.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableFavoredNodes.html" title="class in org.apache.hadoop.hbase.client">TestTableFavoredNodes</a></dt>
@@ -24879,6 +24905,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.html#managerOfCluster">managerOfCluster</a></span> - Static variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestReplicationSourceManager</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#manifestVersion">manifestVersion</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html#Manipulation--">Manipulation()</a></span> - Constructor for enum org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver">DataBlockEncodingTool.Manipulation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.html#manualTest-java.lang.String:A-">manualTest(String[])</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.html" title="class in org.apache.hadoop.hbase.mapreduce">TestHFileOutputFormat2</a></dt>
@@ -27944,6 +27972,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#NUM_RS">NUM_RS</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#NUM_RS">NUM_RS</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.html#NUM_RS">NUM_RS</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.example.<a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor.example">TestRefreshHFilesEndpoint</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/AbstractTestDLS.html#NUM_RS">NUM_RS</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/AbstractTestDLS.html" title="class in org.apache.hadoop.hbase.master">AbstractTestDLS</a></dt>
@@ -36790,6 +36820,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableFavoredNodes.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableFavoredNodes.html" title="class in org.apache.hadoop.hbase.client">TestTableFavoredNodes</a></dt>
@@ -37618,6 +37650,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html#setUpBaseConf-org.apache.hadoop.conf.Configuration-">setUpBaseConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotNoCluster</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#setUpBaseConf-org.apache.hadoop.conf.Configuration-">setUpBaseConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html#setUpBaseConf-org.apache.hadoop.conf.Configuration-">setUpBaseConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobExportSnapshot</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterStatusServlet.html#setupBasicMocks--">setupBasicMocks()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterStatusServlet.html" title="class in org.apache.hadoop.hbase.master">TestMasterStatusServlet</a></dt>
@@ -38132,6 +38166,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotNoCluster</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobExportSnapshot</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestMobSecureExportSnapshot.html#setUpBeforeClass--">setUpBeforeClass()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestMobSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobSecureExportSnapshot</a></dt>
@@ -38261,12 +38297,20 @@
 <dd>
 <div class="block">Setup the config for the cluster and start it</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#setupCluster--">setupCluster()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a></dt>
+<dd>
+<div class="block">Setup the config for the cluster</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html#setupCluster--">setupCluster()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></dt>
 <dd>
 <div class="block">Setup the config for the cluster</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#setupCluster--">setupCluster()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setupCluster--">setupCluster()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>
+<div class="block">Setup the config for the cluster</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#setupCluster--">setupCluster()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html" title="class in org.apache.hadoop.hbase.client">TestTableSnapshotScanner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.html#setupCluster--">setupCluster()</a></span> - Static method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.html" title="class in org.apache.hadoop.hbase.coprocessor">TestOpenTableInCoprocessor</a></dt>
@@ -38387,10 +38431,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotCloneIndependence</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html" title="class in org.apache.hadoop.hbase.client">TestTableSnapshotScanner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatTestBase.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatTestBase.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSnapshotInputFormatTestBase</a></dt>
@@ -40705,6 +40753,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#STRING_TABLE_NAME">STRING_TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#STRING_TABLE_NAME">STRING_TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/TestBufferChain.html#stringBuf-java.lang.String-int-int-">stringBuf(String, int, int)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/TestBufferChain.html" title="class in org.apache.hadoop.hbase.ipc">TestBufferChain</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/TestSortedList.StringComparator.html#StringComparator--">StringComparator()</a></span> - Constructor for class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/TestSortedList.StringComparator.html" title="class in org.apache.hadoop.hbase.util">TestSortedList.StringComparator</a></dt>
@@ -41413,6 +41463,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.example.<a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor.example">TestRefreshHFilesEndpoint</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorExceptionWithAbort</a></dt>
@@ -42039,6 +42091,8 @@
 <dd>
 <div class="block">A set of ports that have been claimed using <a href="org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#randomFreePort--"><code>HBaseTestingUtility.PortAllocator.randomFreePort()</code></a>.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#takeSnapshot-org.apache.hadoop.hbase.TableName-java.lang.String-boolean-">takeSnapshot(TableName, String, boolean)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/thrift/TestThriftHttpServer.html#talkToThriftServer-java.lang.String-int-">talkToThriftServer(String, int)</a></span> - Method in class org.apache.hadoop.hbase.thrift.<a href="org/apache/hadoop/hbase/thrift/TestThriftHttpServer.html" title="class in org.apache.hadoop.hbase.thrift">TestThriftHttpServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/thrift/TestThriftServerCmdLine.html#talkToThriftServer--">talkToThriftServer()</a></span> - Method in class org.apache.hadoop.hbase.thrift.<a href="org/apache/hadoop/hbase/thrift/TestThriftServerCmdLine.html" title="class in org.apache.hadoop.hbase.thrift">TestThriftServerCmdLine</a></dt>
@@ -42191,6 +42245,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html" title="class in org.apache.hadoop.hbase.client">TestTableSnapshotScanner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTimestampsFilter.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTimestampsFilter.html" title="class in org.apache.hadoop.hbase.client">TestTimestampsFilter</a></dt>
@@ -43113,6 +43169,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshot</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestRestoreFlushSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientClusterMetrics.html#tearDownAfterClass--">tearDownAfterClass()</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientClusterMetrics.html" title="class in org.apache.hadoop.hbase">TestClientClusterMetrics</a></dt>
@@ -43221,6 +43279,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.html#TEMP">TEMP</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.html" title="class in org.apache.hadoop.hbase.security.visibility">TestVisibilityLabelsReplication</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEMP_DIR">TEMP_DIR</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#TEMP_DIR">TEMP_DIR</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/monitoring/TestMemoryBoundedLogMessageBuffer.html#TEN_KB">TEN_KB</a></span> - Static variable in class org.apache.hadoop.hbase.monitoring.<a href="org/apache/hadoop/hbase/monitoring/TestMemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">TestMemoryBoundedLogMessageBuffer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/ReplicationSourceDummy.html#terminate-java.lang.String-">terminate(String)</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/ReplicationSourceDummy.html" title="class in org.apache.hadoop.hbase.replication">ReplicationSourceDummy</a></dt>
@@ -43458,6 +43520,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html#TEST_FAM">TEST_FAM</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEST_FAM">TEST_FAM</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/cleaner/TestSnapshotFromMaster.html#TEST_FAM">TEST_FAM</a></span> - Static variable in class org.apache.hadoop.hbase.master.cleaner.<a href="org/apache/hadoop/hbase/master/cleaner/TestSnapshotFromMaster.html" title="class in org.apache.hadoop.hbase.master.cleaner">TestSnapshotFromMaster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.html#TEST_FAM">TEST_FAM</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.html" title="class in org.apache.hadoop.hbase.regionserver">TestMultiLogThreshold</a></dt>
@@ -44982,6 +45046,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAppendFromClientSide.html#testAppendWithCustomTimestamp--">testAppendWithCustomTimestamp()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAppendFromClientSide.html" title="class in org.apache.hadoop.hbase.client">TestAppendFromClientSide</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testAppendWithMultipleFamilies--">testAppendWithMultipleFamilies()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html" title="class in org.apache.hadoop.hbase.regionserver">TestAtomicOperation</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testAppendWithNonExistingFamily--">testAppendWithNonExistingFamily()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html" title="class in org.apache.hadoop.hbase.regionserver">TestAtomicOperation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestFromClientSide.html#testAppendWithoutWAL--">testAppendWithoutWAL()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestFromClientSide.html" title="class in org.apache.hadoop.hbase.client">TestFromClientSide</a></dt>
@@ -47503,6 +47569,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/TestParseFilter.html#testColumnValueFilter--">testColumnValueFilter()</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/TestParseFilter.html" title="class in org.apache.hadoop.hbase.filter">TestParseFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#testColumnWithEmptyQualifier--">testColumnWithEmptyQualifier()</a></span> - Method in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestTableScan.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.html#testCombine1--">testCombine1()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.html" title="class in org.apache.hadoop.hbase.client">TestCompleteResultScanResultCache</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.html#testCombine2--">testCombine2()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestCompleteResultScanResultCache.html" title="class in org.apache.hadoop.hbase.client">TestCompleteResultScanResultCache</a></dt>
@@ -49914,6 +49982,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/encoding/TestBufferedDataBlockEncoder.html#testEnsureSpaceForKey--">testEnsureSpaceForKey()</a></span> - Method in class org.apache.hadoop.hbase.io.encoding.<a href="org/apache/hadoop/hbase/io/encoding/TestBufferedDataBlockEncoder.html" title="class in org.apache.hadoop.hbase.io.encoding">TestBufferedDataBlockEncoder</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testEnsureTemporaryDirectoryTransfer--">testEnsureTemporaryDirectoryTransfer()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/locking/TestEntityLocks.html#testEntityLock--">testEntityLock()</a></span> - Method in class org.apache.hadoop.hbase.client.locking.<a href="org/apache/hadoop/hbase/client/locking/TestEntityLocks.html" title="class in org.apache.hadoop.hbase.client.locking">TestEntityLocks</a></dt>
 <dd>
 <div class="block">Test basic lock function - requestLock, await, unlock.</div>
@@ -50174,6 +50244,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html#TestExportSnapshotNoCluster--">TestExportSnapshotNoCluster()</a></span> - Constructor for class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotNoCluster</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestExportSnapshotWithTemporaryDirectory</span></a> - Class in <a href="org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#TestExportSnapshotWithTemporaryDirectory--">TestExportSnapshotWithTemporaryDirectory()</a></span> - Constructor for class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportWithTargetName--">testExportWithTargetName()</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshot</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/security/visibility/TestExpressionExpander.html" title="class in org.apache.hadoop.hbase.security.visibility"><span class="typeNameLink">TestExpressionExpander</span></a> - Class in <a href="org/apache/hadoop/hbase/security/visibility/package-summary.html">org.apache.hadoop.hbase.security.visibility</a></dt>
@@ -53325,12 +53399,16 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.html#testIsStale--">testIsStale()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreFileRefresherChore</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#testIsSubDirectoryWorks--">testIsSubDirectoryWorks()</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotDescriptionUtils</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncTableAdminApi3.html#testIsTableEnabledAndDisabled--">testIsTableEnabledAndDisabled()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncTableAdminApi3.html" title="class in org.apache.hadoop.hbase.client">TestAsyncTableAdminApi3</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/constraint/TestConstraint.html#testIsUnloaded--">testIsUnloaded()</a></span> - Method in class org.apache.hadoop.hbase.constraint.<a href="org/apache/hadoop/hbase/constraint/TestConstraint.html" title="class in org.apache.hadoop.hbase.constraint">TestConstraint</a></dt>
 <dd>
 <div class="block">Check to make sure a constraint is unloaded when it fails</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#testIsWithinWorkingDir--">testIsWithinWorkingDir()</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotDescriptionUtils</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/TestZooKeeperACL.html#testIsZooKeeperSecure--">testIsZooKeeperSecure()</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/TestZooKeeperACL.html" title="class in org.apache.hadoop.hbase.zookeeper">TestZooKeeperACL</a></dt>
 <dd>
 <div class="block">Check if ZooKeeper JaasConfiguration is valid.</div>
@@ -56533,6 +56611,12 @@
 <dd>
 <div class="block">Test snapshotting a table that is offline</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testOfflineTableSnapshot--">testOfflineTableSnapshot()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>
+<div class="block">Test snapshotting a table that is offline</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testOfflineTableSnapshotWithEmptyRegion--">testOfflineTableSnapshotWithEmptyRegion()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html#testOfflineTableSnapshotWithEmptyRegions--">testOfflineTableSnapshotWithEmptyRegions()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestDefaultCompactSelection.html#testOffPeakCompactionRatio--">testOffPeakCompactionRatio()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestDefaultCompactSelection.html" title="class in org.apache.hadoop.hbase.regionserver">TestDefaultCompactSelection</a></dt>
@@ -59693,10 +59777,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestRestoreBoundaryTests.html#TestRestoreBoundaryTests--">TestRestoreBoundaryTests()</a></span> - Constructor for class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestRestoreBoundaryTests.html" title="class in org.apache.hadoop.hbase.backup">TestRestoreBoundaryTests</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreDisabledSnapshot--">testRestoreDisabledSnapshot()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupCommandLineTool.html#testRestoreDriverHelp--">testRestoreDriverHelp()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupCommandLineTool.html" title="class in org.apache.hadoop.hbase.backup">TestBackupCommandLineTool</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupCommandLineTool.html#testRestoreDriverUnrecognizedOption--">testRestoreDriverUnrecognizedOption()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupCommandLineTool.html" title="class in org.apache.hadoop.hbase.backup">TestBackupCommandLineTool</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreEnabledSnapshot--">testRestoreEnabledSnapshot()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestRestoreFlushSnapshotFromClient</span></a> - Class in <a href="org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a></dt>
 <dd>
 <div class="block">Test clone/restore snapshots from the client
@@ -62165,6 +62253,11 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.MasterSyncObserver.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestSnapshotClientRetries.MasterSyncObserver</span></a> - Class in <a href="org/apache/hadoop/hbase/snapshot/package-summary.html">org.apache.hadoop.hbase.snapshot</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testSnapshotCloneContents--">testSnapshotCloneContents()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>
+<div class="block">Tests that snapshot has correct contents by taking snapshot, cloning it, then affirming
+ the contents of the original and cloned table match</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotCloneIndependence</span></a> - Class in <a href="org/apache/hadoop/hbase/client/package-summary.html">org.apache.hadoop.hbase.client</a></dt>
 <dd>
 <div class="block">Test to verify that the cloned table is independent of the table from which it was cloned</div>
@@ -62181,6 +62274,13 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#TestSnapshotDescriptionUtils--">TestSnapshotDescriptionUtils()</a></span> - Constructor for class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotDescriptionUtils</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotDFSTemporaryDirectory</span></a> - Class in <a href="org/apache/hadoop/hbase/client/package-summary.html">org.apache.hadoop.hbase.client</a></dt>
+<dd>
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on the same file system as the root directory</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#TestSnapshotDFSTemporaryDirectory--">TestSnapshotDFSTemporaryDirectory()</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html#testSnapshotFailsOnNonExistantTable--">testSnapshotFailsOnNonExistantTable()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html#testSnapshotFailsOnNonExistantTable--">testSnapshotFailsOnNonExistantTable()</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestFlushSnapshotFromClient</a></dt>
@@ -62273,6 +62373,17 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html#testSnapshotTempDirReload--">testSnapshotTempDirReload()</a></span> - Method in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html" title="class in org.apache.hadoop.hbase.master.snapshot">TestSnapshotFileCache</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotTemporaryDirectory</span></a> - Class in <a href="org/apache/hadoop/hbase/client/package-summary.html">org.apache.hadoop.hbase.client</a></dt>
+<dd>
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on a different file system than the root directory</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TestSnapshotTemporaryDirectory--">TestSnapshotTemporaryDirectory()</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotTemporaryDirectoryWithRegionReplicas</span></a> - Class in <a href="org/apache/hadoop/hbase/client/package-summary.html">org.apache.hadoop.hbase.client</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#TestSnapshotTemporaryDirectoryWithRegionReplicas--">TestSnapshotTemporaryDirectoryWithRegionReplicas()</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompactingMemStore.html#testSnapshotting--">testSnapshotting()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompactingMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompactingMemStore</a></dt>
 <dd>
 <div class="block">Test memstore snapshots</div>
@@ -64812,6 +64923,8 @@
 <dd>
 <div class="block">Test WAL replay behavior with WALObserver.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWALDirAndWALArchiveDir--">testWALDirAndWALArchiveDir()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestWALDurability</span></a> - Class in <a href="org/apache/hadoop/hbase/regionserver/wal/package-summary.html">org.apache.hadoop.hbase.regionserver.wal</a></dt>
 <dd>
 <div class="block">Tests for WAL write durability - hflush vs hsync</div>
@@ -66876,6 +66989,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#UTIL">UTIL</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html" title="class in org.apache.hadoop.hbase.client">TestTableSnapshotScanner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/constraint/TestConstraint.html#util">util</a></span> - Static variable in class org.apache.hadoop.hbase.constraint.<a href="org/apache/hadoop/hbase/constraint/TestConstraint.html" title="class in org.apache.hadoop.hbase.constraint">TestConstraint</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 6af42fe..2d9b60f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -146,8 +146,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>


[18/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/client/package-tree.html
index c297d21..4e2d341 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -515,6 +515,12 @@
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotMetadata</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotTemporaryDirectory</span></a>
+<ul>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotDFSTemporaryDirectory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotTemporaryDirectoryWithRegionReplicas</span></a></li>
+</ul>
+</li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotWithAcl.AccessReadAction</span></a> (implements org.apache.hadoop.hbase.security.access.<a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotWithAcl.AccessWriteAction</span></a> (implements org.apache.hadoop.hbase.security.access.<a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSplitOrMergeStatus</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/package-use.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/package-use.html b/testdevapidocs/org/apache/hadoop/hbase/client/package-use.html
index e89ffa5..683d0ad 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/package-use.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/package-use.html
@@ -227,6 +227,12 @@
 <div class="block">Test create/using/deleting snapshots from the client</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectory.html#org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a>
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on a different file system than the root directory</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html b/testdevapidocs/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
index 3193c7d..3930687 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
@@ -439,7 +439,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCorruptedDataManifest</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html#line.161">testCorruptedDataManifest</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html#line.162">testCorruptedDataManifest</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">If there is a corrupted data manifest, it should throw out CorruptedSnapshotException,
  instead of an IOException</div>
@@ -455,7 +455,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testMissedTmpSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html#line.187">testMissedTmpSnapshot</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html#line.189">testMissedTmpSnapshot</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">HBASE-16464</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 8b2cdec..d9e587f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -578,15 +578,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 6f5d107..5fc6b0a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -212,8 +212,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
index 8c1a0f3..d65b315 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
@@ -212,7 +212,7 @@ extends org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore</h3>
-<code>delete, delete, delete, getActiveLogs, getCorruptedLogs, getFileSystem, getLogFilePath, getMillisFromLastRoll, getMillisToNextPeriodicRoll, getNumThreads, getStoreTracker, getSyncMetrics, getWALDir, insert, insert, load, main, periodicRollForTesting, recoverLease, removeInactiveLogsForTesting, rollWriter, rollWriterForTesting, setRunningProcedureCount, start, stop, syncSlots, update</code></li>
+<code>delete, delete, delete, getActiveLogs, getCorruptedLogs, getFileSystem, getLogFilePath, getMillisFromLastRoll, getMillisToNextPeriodicRoll, getNumThreads, getStoreTracker, getSyncMetrics, getWalArchiveDir, getWALDir, insert, insert, load, main, periodicRollForTesting, recoverLease, removeInactiveLogsForTesting, rollWriter, rollWriterForTesting, setRunningProcedureCount, start, stop, syncSlots, update</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
index 081f063..d028df3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.940">TestWALProcedureStore.TestSequentialProcedure</a>
+<pre>public static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.956">TestWALProcedureStore.TestSequentialProcedure</a>
 extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
 </li>
 </ul>
@@ -267,7 +267,7 @@ extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https
 <ul class="blockListLast">
 <li class="blockList">
 <h4>seqid</h4>
-<pre>private static&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.941">seqid</a></pre>
+<pre>private static&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.957">seqid</a></pre>
 </li>
 </ul>
 </li>
@@ -284,7 +284,7 @@ extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestSequentialProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.943">TestSequentialProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.959">TestSequentialProcedure</a>()</pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@ extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.948">execute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.964">execute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>execute</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
@@ -314,7 +314,7 @@ extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https
 <ul class="blockList">
 <li class="blockList">
 <h4>rollback</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.951">rollback</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.967">rollback</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>rollback</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
@@ -327,7 +327,7 @@ extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.954">abort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.970">abort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>abort</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
@@ -340,7 +340,7 @@ extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.957">serializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.973">serializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -356,7 +356,7 @@ extends org.apache.hadoop.hbase.procedure2.SequentialProcedure&lt;<a href="https
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.967">deserializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#line.983">deserializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
index edb0e20..0f15b9c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":10,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10};
+var methods = {"i0":9,"i1":10,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -240,127 +240,135 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
           long&nbsp;dropBytes)</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
+<td class="colFirst"><code>private org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#createWALProcedureStore-org.apache.hadoop.conf.Configuration-">createWALProcedureStore</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.LoadCounter.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.LoadCounter</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#restartAndAssert-long-long-int-int-">restartAndAssert</a></span>(long&nbsp;maxProcId,
                 long&nbsp;runnableCount,
                 int&nbsp;completedCount,
                 int&nbsp;corruptedCount)</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#setUp--">setUp</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#setupConfig-org.apache.hadoop.conf.Configuration-">setupConfig</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#storeRestart-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureLoader-">storeRestart</a></span>(org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureLoader&nbsp;loader)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#tearDown--">tearDown</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testBatchDelete--">testBatchDelete</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testBatchInsert--">testBatchInsert</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testCorruptedEntries--">testCorruptedEntries</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testCorruptedProcedures--">testCorruptedProcedures</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testCorruptedTrailer--">testCorruptedTrailer</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testCorruptedTrailersRebuild--">testCorruptedTrailersRebuild</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testEmptyLogLoad--">testEmptyLogLoad</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testEmptyRoll--">testEmptyRoll</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testFileNotFoundDuringLeaseRecovery--">testFileNotFoundDuringLeaseRecovery</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testLoad--">testLoad</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testLoadChildren--">testLoadChildren</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testLogFileAleadExists--">testLogFileAleadExists</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testNoTrailerDoubleRestart--">testNoTrailerDoubleRestart</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testProcIdHoles--">testProcIdHoles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testRestartWithoutData--">testRestartWithoutData</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testRollAndRemove--">testRollAndRemove</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWalCleanerNoHoles--">testWalCleanerNoHoles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWalCleanerSequentialClean--">testWalCleanerSequentialClean</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWalCleanerUpdates--">testWalCleanerUpdates</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWalCleanerUpdatesDontLeaveHoles--">testWalCleanerUpdatesDontLeaveHoles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWalCleanerWithEmptyRolls--">testWalCleanerWithEmptyRolls</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWALDirAndWALArchiveDir--">testWALDirAndWALArchiveDir</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWalReplayOrder_AB_A--">testWalReplayOrder_AB_A</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#testWalReplayOrder_ABC_BAD--">testWalReplayOrder_ABC_BAD</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#trackersLoadedForAllOldLogs--">trackersLoadedForAllOldLogs</a></span>()</code>
 <div class="block">Tests that tracker for all old logs are loaded back after procedure store is restarted.</div>
 </td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#verifyProcIdsOnRestart-java.util.Set-">verifyProcIdsOnRestart</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;procIds)</code>&nbsp;</td>
 </tr>
@@ -908,13 +916,41 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testWALDirAndWALArchiveDir--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testWALDirAndWALArchiveDir</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.902">testWALDirAndWALArchiveDir</a>()
+                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
+</li>
+</ul>
+<a name="createWALProcedureStore-org.apache.hadoop.conf.Configuration-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>createWALProcedureStore</h4>
+<pre>private&nbsp;org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.908">createWALProcedureStore</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+                                                                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
+</li>
+</ul>
 <a name="restartAndAssert-long-long-int-int-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>restartAndAssert</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.LoadCounter.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.LoadCounter</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.901">restartAndAssert</a>(long&nbsp;maxProcId,
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.LoadCounter.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.LoadCounter</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.917">restartAndAssert</a>(long&nbsp;maxProcId,
                                                              long&nbsp;runnableCount,
                                                              int&nbsp;completedCount,
                                                              int&nbsp;corruptedCount)
@@ -931,7 +967,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>corruptLog</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.907">corruptLog</a>(org.apache.hadoop.fs.FileStatus&nbsp;logFile,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.923">corruptLog</a>(org.apache.hadoop.fs.FileStatus&nbsp;logFile,
                         long&nbsp;dropBytes)
                  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>
@@ -946,7 +982,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyProcIdsOnRestart</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.921">verifyProcIdsOnRestart</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;procIds)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.937">verifyProcIdsOnRestart</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;procIds)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -960,7 +996,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>assertEmptyLogDir</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.929">assertEmptyLogDir</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#line.945">assertEmptyLogDir</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
index 63d3526..eba2510 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
@@ -116,7 +116,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.564">TestAtomicOperation.AtomicOperation</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.603">TestAtomicOperation.AtomicOperation</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 </li>
 </ul>
@@ -241,7 +241,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected final&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.565">region</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.604">region</a></pre>
 </li>
 </ul>
 <a name="numOps">
@@ -250,7 +250,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numOps</h4>
-<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.566">numOps</a></pre>
+<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.605">numOps</a></pre>
 </li>
 </ul>
 <a name="timeStamps">
@@ -259,7 +259,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>timeStamps</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.567">timeStamps</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.606">timeStamps</a></pre>
 </li>
 </ul>
 <a name="failures">
@@ -268,7 +268,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>failures</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.568">failures</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.607">failures</a></pre>
 </li>
 </ul>
 <a name="r">
@@ -277,7 +277,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>r</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.569">r</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.608">r</a></pre>
 </li>
 </ul>
 </li>
@@ -294,7 +294,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AtomicOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.571">AtomicOperation</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html#line.610">AtomicOperation</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                        int&nbsp;numOps,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a>&nbsp;timeStamps,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a>&nbsp;failures)</pre>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
index 7272413..c66afd4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.648">TestAtomicOperation.CheckAndPutThread</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.687">TestAtomicOperation.CheckAndPutThread</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestThread</a></pre>
 </li>
 </ul>
@@ -259,7 +259,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.Te
 <ul class="blockListLast">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.Region <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html#line.649">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.Region <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html#line.688">region</a></pre>
 </li>
 </ul>
 </li>
@@ -276,7 +276,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.Te
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CheckAndPutThread</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html#line.650">CheckAndPutThread</a>(<a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.TestContext.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestContext</a>&nbsp;ctx,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html#line.689">CheckAndPutThread</a>(<a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.TestContext.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestContext</a>&nbsp;ctx,
                   org.apache.hadoop.hbase.regionserver.Region&nbsp;region)</pre>
 </li>
 </ul>
@@ -294,7 +294,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.Te
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doWork</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html#line.656">doWork</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html#line.695">doWork</a>()
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
index 8b08b40..c59a8b5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.273">TestAtomicOperation.Incrementer</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.312">TestAtomicOperation.Incrementer</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 <div class="block">A thread that makes increment calls always on the same row, this.row against two column
  families on this row.</div>
@@ -252,7 +252,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.regionserver.Region <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.275">region</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.regionserver.Region <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.314">region</a></pre>
 </li>
 </ul>
 <a name="numIncrements">
@@ -261,7 +261,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numIncrements</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.276">numIncrements</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.315">numIncrements</a></pre>
 </li>
 </ul>
 <a name="amount">
@@ -270,7 +270,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>amount</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.277">amount</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.316">amount</a></pre>
 </li>
 </ul>
 </li>
@@ -287,7 +287,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Incrementer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.280">Incrementer</a>(org.apache.hadoop.hbase.regionserver.Region&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.319">Incrementer</a>(org.apache.hadoop.hbase.regionserver.Region&nbsp;region,
                    int&nbsp;threadNumber,
                    int&nbsp;amount,
                    int&nbsp;numIncrements)</pre>
@@ -307,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.289">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html#line.328">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
index aa807c4..de9f538 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html#line.687">TestAtomicOperation.MockHRegion.WrappedRowLock</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html#line.726">TestAtomicOperation.MockHRegion.WrappedRowLock</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements org.apache.hadoop.hbase.regionserver.Region.RowLock</pre>
 </li>
@@ -208,7 +208,7 @@ implements org.apache.hadoop.hbase.regionserver.Region.RowLock</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rowLock</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.regionserver.Region.RowLock <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html#line.689">rowLock</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.regionserver.Region.RowLock <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html#line.728">rowLock</a></pre>
 </li>
 </ul>
 </li>
@@ -225,7 +225,7 @@ implements org.apache.hadoop.hbase.regionserver.Region.RowLock</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WrappedRowLock</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html#line.691">WrappedRowLock</a>(org.apache.hadoop.hbase.regionserver.Region.RowLock&nbsp;rowLock)</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html#line.730">WrappedRowLock</a>(org.apache.hadoop.hbase.regionserver.Region.RowLock&nbsp;rowLock)</pre>
 </li>
 </ul>
 </li>
@@ -242,7 +242,7 @@ implements org.apache.hadoop.hbase.regionserver.Region.RowLock</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>release</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html#line.697">release</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.WrappedRowLock.html#line.736">release</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>release</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.regionserver.Region.RowLock</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
index 7fa1b03..4c0cdb3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.671">TestAtomicOperation.MockHRegion</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.710">TestAtomicOperation.MockHRegion</a>
 extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MockHRegion</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html#line.673">MockHRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html#line.712">MockHRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                    org.apache.hadoop.hbase.wal.WAL&nbsp;log,
                    org.apache.hadoop.fs.FileSystem&nbsp;fs,
                    org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -284,7 +284,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRowLockInternal</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.Region.RowLock&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html#line.679">getRowLockInternal</a>(byte[]&nbsp;row,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.Region.RowLock&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html#line.718">getRowLockInternal</a>(byte[]&nbsp;row,
                                                                               boolean&nbsp;readLock,
                                                                               org.apache.hadoop.hbase.regionserver.Region.RowLock&nbsp;prevRowlock)
                                                                        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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
index 374fb59..b45139d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.630">TestAtomicOperation.PutThread</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.669">TestAtomicOperation.PutThread</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestThread</a></pre>
 </li>
 </ul>
@@ -259,7 +259,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.Te
 <ul class="blockListLast">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.Region <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html#line.631">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.Region <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html#line.670">region</a></pre>
 </li>
 </ul>
 </li>
@@ -276,7 +276,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.Te
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PutThread</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html#line.632">PutThread</a>(<a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.TestContext.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestContext</a>&nbsp;ctx,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html#line.671">PutThread</a>(<a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.TestContext.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestContext</a>&nbsp;ctx,
           org.apache.hadoop.hbase.regionserver.Region&nbsp;region)</pre>
 </li>
 </ul>
@@ -294,7 +294,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/MultithreadedTestUtil.Te
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doWork</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html#line.638">doWork</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.PutThread.html#line.677">doWork</a>()
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
index f2e10c7..04ffe36 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.581">TestAtomicOperation.TestStep</a>
+<pre>private static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.620">TestAtomicOperation.TestStep</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a>&gt;</pre>
 </li>
 </ul>
@@ -219,7 +219,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>INIT</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.582">INIT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.621">INIT</a></pre>
 </li>
 </ul>
 <a name="PUT_STARTED">
@@ -228,7 +228,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>PUT_STARTED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.583">PUT_STARTED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.622">PUT_STARTED</a></pre>
 </li>
 </ul>
 <a name="PUT_COMPLETED">
@@ -237,7 +237,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>PUT_COMPLETED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.584">PUT_COMPLETED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.623">PUT_COMPLETED</a></pre>
 </li>
 </ul>
 <a name="CHECKANDPUT_STARTED">
@@ -246,7 +246,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>CHECKANDPUT_STARTED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.585">CHECKANDPUT_STARTED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.624">CHECKANDPUT_STARTED</a></pre>
 </li>
 </ul>
 <a name="CHECKANDPUT_COMPLETED">
@@ -255,7 +255,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CHECKANDPUT_COMPLETED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.586">CHECKANDPUT_COMPLETED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.625">CHECKANDPUT_COMPLETED</a></pre>
 </li>
 </ul>
 </li>
@@ -272,7 +272,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.581">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.620">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -292,7 +292,7 @@ for (TestAtomicOperation.TestStep c : TestAtomicOperation.TestStep.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.581">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html#line.620">valueOf</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>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 


[27/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.CompletedSnaphotDirectoriesFilter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.CompletedSnaphotDirectoriesFilter.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.CompletedSnaphotDirectoriesFilter.html
index 7462d5b..63a00a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.CompletedSnaphotDirectoriesFilter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.CompletedSnaphotDirectoriesFilter.html
@@ -122,294 +122,339 @@
 <span class="sourceLineNo">114</span>  /** Temporary directory under the snapshot directory to store in-progress snapshots */<a name="line.114"></a>
 <span class="sourceLineNo">115</span>  public static final String SNAPSHOT_TMP_DIR_NAME = ".tmp";<a name="line.115"></a>
 <span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  /** This tag will be created in in-progess snapshots */<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  public static final String SNAPSHOT_IN_PROGRESS = ".inprogress";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // snapshot operation values<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  /** Default value if no start time is specified */<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  public static final long NO_SNAPSHOT_START_TIME_SPECIFIED = 0;<a name="line.121"></a>
+<span class="sourceLineNo">117</span>  /**<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * The configuration property that determines the filepath of the snapshot<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * base working directory<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public static final String SNAPSHOT_WORKING_DIR = "hbase.snapshot.working.dir";<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 static final String MASTER_SNAPSHOT_TIMEOUT_MILLIS = "hbase.snapshot.master.timeout.millis";<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  /** By default, wait 300 seconds for a snapshot to complete */<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public static final long DEFAULT_MAX_WAIT_TIME = 60000 * 5 ;<a name="line.127"></a>
+<span class="sourceLineNo">123</span>  /** This tag will be created in in-progess snapshots */<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  public static final String SNAPSHOT_IN_PROGRESS = ".inprogress";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  // snapshot operation values<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  /** Default value if no start time is specified */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static final long NO_SNAPSHOT_START_TIME_SPECIFIED = 0;<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * By default, check to see if the snapshot is complete (ms)<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @deprecated Use {@link #DEFAULT_MAX_WAIT_TIME} instead.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Deprecated<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static final int SNAPSHOT_TIMEOUT_MILLIS_DEFAULT = 60000 * 5;<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  /**<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * Conf key for # of ms elapsed before injecting a snapshot timeout error when waiting for<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * completion.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * @deprecated Use {@link #MASTER_SNAPSHOT_TIMEOUT_MILLIS} instead.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  @Deprecated<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final String SNAPSHOT_TIMEOUT_MILLIS_KEY = "hbase.snapshot.master.timeoutMillis";<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private SnapshotDescriptionUtils() {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    // private constructor for utility class<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  /**<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param conf {@link Configuration} from which to check for the timeout<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @param type type of snapshot being taken<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * @param defaultMaxWaitTime Default amount of time to wait, if none is in the configuration<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * @return the max amount of time the master should wait for a snapshot to complete<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public static long getMaxMasterTimeout(Configuration conf, SnapshotDescription.Type type,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      long defaultMaxWaitTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    String confKey;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    switch (type) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    case DISABLED:<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    default:<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      confKey = MASTER_SNAPSHOT_TIMEOUT_MILLIS;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    }<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    return Math.max(conf.getLong(confKey, defaultMaxWaitTime),<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        conf.getLong(SNAPSHOT_TIMEOUT_MILLIS_KEY, defaultMaxWaitTime));<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * Get the snapshot root directory. All the snapshots are kept under this directory, i.e.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * ${hbase.rootdir}/.snapshot<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param rootDir hbase root directory<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * @return the base directory in which all snapshots are kept<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static Path getSnapshotRootDir(final Path rootDir) {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  /**<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * Get the directory for a specified snapshot. This directory is a sub-directory of snapshot root<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param snapshot snapshot being taken<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * @param rootDir hbase root directory<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * @return the final directory for the completed snapshot<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  public static Path getCompletedSnapshotDir(final SnapshotDescription snapshot, final Path rootDir) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    return getCompletedSnapshotDir(snapshot.getName(), rootDir);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Get the directory for a completed snapshot. This directory is a sub-directory of snapshot root<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param snapshotName name of the snapshot being taken<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @param rootDir hbase root directory<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @return the final directory for the completed snapshot<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  public static Path getCompletedSnapshotDir(final String snapshotName, final Path rootDir) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    return getCompletedSnapshotDir(getSnapshotsDir(rootDir), snapshotName);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  }<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">200</span>   * Get the general working directory for snapshots - where they are built, where they are<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * temporarily copied on export, etc.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @param rootDir root directory of the HBase installation<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @return Path to the snapshot tmp directory, relative to the passed root directory<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public static Path getWorkingSnapshotDir(final Path rootDir) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    return new Path(getSnapshotsDir(rootDir), SNAPSHOT_TMP_DIR_NAME);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * @param snapshot snapshot that will be built<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param rootDir root directory of the hbase installation<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @return {@link Path} where one can build a snapshot<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  public static Path getWorkingSnapshotDir(SnapshotDescription snapshot, final Path rootDir) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    return getCompletedSnapshotDir(getWorkingSnapshotDir(rootDir), snapshot.getName());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /**<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * @param snapshotName name of the snapshot<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @param rootDir root directory of the hbase installation<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   * @return {@link Path} where one can build a snapshot<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   */<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public static Path getWorkingSnapshotDir(String snapshotName, final Path rootDir) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return getCompletedSnapshotDir(getWorkingSnapshotDir(rootDir), snapshotName);<a name="line.226"></a>
+<span class="sourceLineNo">130</span>  public static final String MASTER_SNAPSHOT_TIMEOUT_MILLIS = "hbase.snapshot.master.timeout.millis";<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  /** By default, wait 300 seconds for a snapshot to complete */<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public static final long DEFAULT_MAX_WAIT_TIME = 60000 * 5 ;<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">137</span>   * By default, check to see if the snapshot is complete (ms)<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * @deprecated Use {@link #DEFAULT_MAX_WAIT_TIME} instead.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  @Deprecated<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final int SNAPSHOT_TIMEOUT_MILLIS_DEFAULT = 60000 * 5;<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>   * Conf key for # of ms elapsed before injecting a snapshot timeout error when waiting for<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * completion.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @deprecated Use {@link #MASTER_SNAPSHOT_TIMEOUT_MILLIS} instead.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  @Deprecated<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public static final String SNAPSHOT_TIMEOUT_MILLIS_KEY = "hbase.snapshot.master.timeoutMillis";<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private SnapshotDescriptionUtils() {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    // private constructor for utility class<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  /**<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param conf {@link Configuration} from which to check for the timeout<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param type type of snapshot being taken<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @param defaultMaxWaitTime Default amount of time to wait, if none is in the configuration<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @return the max amount of time the master should wait for a snapshot to complete<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public static long getMaxMasterTimeout(Configuration conf, SnapshotDescription.Type type,<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      long defaultMaxWaitTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    String confKey;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    switch (type) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    case DISABLED:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    default:<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      confKey = MASTER_SNAPSHOT_TIMEOUT_MILLIS;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return Math.max(conf.getLong(confKey, defaultMaxWaitTime),<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        conf.getLong(SNAPSHOT_TIMEOUT_MILLIS_KEY, defaultMaxWaitTime));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  /**<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * Get the snapshot root directory. All the snapshots are kept under this directory, i.e.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * ${hbase.rootdir}/.snapshot<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * @param rootDir hbase root directory<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * @return the base directory in which all snapshots are kept<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public static Path getSnapshotRootDir(final Path rootDir) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * Get the directory for a specified snapshot. This directory is a sub-directory of snapshot root<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @param snapshot snapshot being taken<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * @param rootDir hbase root directory<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * @return the final directory for the completed snapshot<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   */<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  public static Path getCompletedSnapshotDir(final SnapshotDescription snapshot, final Path rootDir) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    return getCompletedSnapshotDir(snapshot.getName(), rootDir);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  /**<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * Get the directory for a completed snapshot. This directory is a sub-directory of snapshot root<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param snapshotName name of the snapshot being taken<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param rootDir hbase root directory<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @return the final directory for the completed snapshot<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  public static Path getCompletedSnapshotDir(final String snapshotName, final Path rootDir) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    return getSpecifiedSnapshotDir(getSnapshotsDir(rootDir), snapshotName);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /**<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * Get the general working directory for snapshots - where they are built, where they are<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * temporarily copied on export, etc.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * @param rootDir root directory of the HBase installation<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param conf Configuration of the HBase instance<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * @return Path to the snapshot tmp directory, relative to the passed root directory<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  public static Path getWorkingSnapshotDir(final Path rootDir, final Configuration conf) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    return new Path(conf.get(SNAPSHOT_WORKING_DIR,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        getDefaultWorkingSnapshotDir(rootDir).toString()));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @param snapshot snapshot that will be built<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * @param rootDir root directory of the hbase installation<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * @param conf Configuration of the HBase instance<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * @return {@link Path} where one can build a snapshot<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public static Path getWorkingSnapshotDir(SnapshotDescription snapshot, final Path rootDir,<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      Configuration conf) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    return getWorkingSnapshotDir(snapshot.getName(), rootDir, conf);<a name="line.226"></a>
 <span class="sourceLineNo">227</span>  }<a name="line.227"></a>
 <span class="sourceLineNo">228</span><a name="line.228"></a>
 <span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Get the directory to store the snapshot instance<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param snapshotsDir hbase-global directory for storing all snapshots<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param snapshotName name of the snapshot to take<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @return the final directory for the completed snapshot<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  private static final Path getCompletedSnapshotDir(final Path snapshotsDir, String snapshotName) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    return new Path(snapshotsDir, snapshotName);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * @param rootDir hbase root directory<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * @return the directory for all completed snapshots;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   */<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  public static final Path getSnapshotsDir(Path rootDir) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<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>   * Convert the passed snapshot description into a 'full' snapshot description based on default<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * parameters, if none have been supplied. This resolves any 'optional' parameters that aren't<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * supplied to their default values.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @param snapshot general snapshot descriptor<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param conf Configuration to read configured snapshot defaults if snapshot is not complete<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @return a valid snapshot description<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @throws IllegalArgumentException if the {@link SnapshotDescription} is not a complete<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   *           {@link SnapshotDescription}.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  public static SnapshotDescription validate(SnapshotDescription snapshot, Configuration conf)<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      throws IllegalArgumentException, IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    if (!snapshot.hasTable()) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      throw new IllegalArgumentException(<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          "Descriptor doesn't apply to a table, so we can't build it.");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // set the creation time, if one hasn't been set<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    long time = snapshot.getCreationTime();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    if (time == SnapshotDescriptionUtils.NO_SNAPSHOT_START_TIME_SPECIFIED) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      time = EnvironmentEdgeManager.currentTime();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      LOG.debug("Creation time not specified, setting to:" + time + " (current time:"<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          + EnvironmentEdgeManager.currentTime() + ").");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      SnapshotDescription.Builder builder = snapshot.toBuilder();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      builder.setCreationTime(time);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      snapshot = builder.build();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // set the acl to snapshot if security feature is enabled.<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    if (isSecurityAvailable(conf)) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      snapshot = writeAclToSnapshotDescription(snapshot, conf);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return snapshot;<a name="line.279"></a>
+<span class="sourceLineNo">230</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @param snapshotName name of the snapshot<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * @param rootDir root directory of the hbase installation<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param conf Configuration of the HBase instance<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @return {@link Path} where one can build a snapshot<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public static Path getWorkingSnapshotDir(String snapshotName, final Path rootDir,<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      Configuration conf) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    return getSpecifiedSnapshotDir(getWorkingSnapshotDir(rootDir, conf), snapshotName);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * Get the directory within the given filepath to store the snapshot instance<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param snapshotsDir directory to store snapshot directory within<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * @param snapshotName name of the snapshot to take<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @return the final directory for the snapshot in the given filepath<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  private static final Path getSpecifiedSnapshotDir(final Path snapshotsDir, String snapshotName) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    return new Path(snapshotsDir, snapshotName);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * @param rootDir hbase root directory<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * @return the directory for all completed snapshots;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  public static final Path getSnapshotsDir(Path rootDir) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
+<span class="sourceLineNo">258</span><a name="line.258"></a>
+<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * Determines if the given workingDir is a subdirectory of the given "root directory"<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * @param workingDir a directory to check<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * @param rootDir root directory of the HBase installation<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * @return true if the given workingDir is a subdirectory of the given root directory,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   *   false otherwise<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static boolean isSubDirectoryOf(final Path workingDir, final Path rootDir) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return workingDir.toString().startsWith(rootDir.toString() + Path.SEPARATOR);<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>   * Determines if the given workingDir is a subdirectory of the default working snapshot directory<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * @param workingDir a directory to check<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param conf configuration for the HBase cluster<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @return true if the given workingDir is a subdirectory of the default working directory for<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   *   snapshots, false otherwise<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public static boolean isWithinDefaultWorkingDir(final Path workingDir, Configuration conf) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Path defaultWorkingDir = getDefaultWorkingSnapshotDir(new Path(conf.get(HConstants.HBASE_DIR)));<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return workingDir.equals(defaultWorkingDir) || isSubDirectoryOf(workingDir, defaultWorkingDir);<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Write the snapshot description into the working directory of a snapshot<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param snapshot description of the snapshot being taken<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * @param workingDir working directory of the snapshot<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @param fs {@link FileSystem} on which the snapshot should be taken<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @throws IOException if we can't reach the filesystem and the file cannot be cleaned up on<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   *           failure<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public static void writeSnapshotInfo(SnapshotDescription snapshot, Path workingDir, FileSystem fs)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      throws IOException {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    Path snapshotInfo = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOTINFO_FILE);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    try {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      FSDataOutputStream out = FSUtils.create(fs, snapshotInfo, perms, true);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      try {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        snapshot.writeTo(out);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      } finally {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        out.close();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    } catch (IOException e) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      // if we get an exception, try to remove the snapshot info<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      if (!fs.delete(snapshotInfo, false)) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        String msg = "Couldn't delete snapshot info file: " + snapshotInfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        LOG.error(msg);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        throw new IOException(msg);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * Create in-progress tag under .tmp of in-progress snapshot<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static void createInProgressTag(Path workingDir, FileSystem fs) throws IOException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Path snapshot_in_progress = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOT_IN_PROGRESS);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    FSUtils.create(fs, snapshot_in_progress, perms, true);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  /**<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * Read in the {@link org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription} stored for the snapshot in the passed directory<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * @param fs filesystem where the snapshot was taken<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * @param snapshotDir directory where the snapshot was stored<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * @return the stored snapshot description<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * @throws CorruptedSnapshotException if the<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * snapshot cannot be read<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public static SnapshotDescription readSnapshotInfo(FileSystem fs, Path snapshotDir)<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws CorruptedSnapshotException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    Path snapshotInfo = new Path(snapshotDir, SNAPSHOTINFO_FILE);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    try {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      FSDataInputStream in = null;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      try {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        in = fs.open(snapshotInfo);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        SnapshotDescription desc = SnapshotDescription.parseFrom(in);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        return desc;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      } finally {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        if (in != null) in.close();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    } catch (IOException e) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      throw new CorruptedSnapshotException("Couldn't read snapshot info from:" + snapshotInfo, e);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Move the finished snapshot to its final, publicly visible directory - this marks the snapshot<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * as 'complete'.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @param snapshot description of the snapshot being tabken<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param rootdir root directory of the hbase installation<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param workingDir directory where the in progress snapshot was built<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param fs {@link FileSystem} where the snapshot was built<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @throws org.apache.hadoop.hbase.snapshot.SnapshotCreationException if the<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * snapshot could not be moved<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @throws IOException the filesystem could not be reached<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  public static void completeSnapshot(SnapshotDescription snapshot, Path rootdir, Path workingDir,<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      FileSystem fs) throws SnapshotCreationException, IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    Path finishedDir = getCompletedSnapshotDir(snapshot, rootdir);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    LOG.debug("Snapshot is done, just moving the snapshot from " + workingDir + " to "<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        + finishedDir);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (!fs.rename(workingDir, finishedDir)) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      throw new SnapshotCreationException(<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          "Failed to move working directory(" + workingDir + ") to completed directory("<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              + finishedDir + ").", ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /**<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * Check if the user is this table snapshot's owner<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @param snapshot the table snapshot description<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @param user the user<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @return true if the user is the owner of the snapshot,<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   *         false otherwise or the snapshot owner field is not present.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public static boolean isSnapshotOwner(org.apache.hadoop.hbase.client.SnapshotDescription snapshot,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      User user) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    if (user == null) return false;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    return user.getShortName().equals(snapshot.getOwner());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  public static boolean isSecurityAvailable(Configuration conf) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    try (Connection conn = ConnectionFactory.createConnection(conf)) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      try (Admin admin = conn.getAdmin()) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        return admin.tableExists(AccessControlLists.ACL_TABLE_NAME);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private static SnapshotDescription writeAclToSnapshotDescription(SnapshotDescription snapshot,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      Configuration conf) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    ListMultimap&lt;String, TablePermission&gt; perms =<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        User.runAsLoginUser(new PrivilegedExceptionAction&lt;ListMultimap&lt;String, TablePermission&gt;&gt;() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          @Override<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          public ListMultimap&lt;String, TablePermission&gt; run() throws Exception {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            return AccessControlLists.getTablePermissions(conf,<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              TableName.valueOf(snapshot.getTable()));<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        });<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    return snapshot.toBuilder()<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .setUsersAndPermissions(ShadedAccessControlUtil.toUserTablePermissions(perms)).build();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>}<a name="line.404"></a>
+<span class="sourceLineNo">283</span>   * Get the default working directory for snapshots - where they are built, where they are<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   * temporarily copied on export, etc.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>   * @param rootDir root directory of the HBase installation<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @return Path to the default snapshot tmp directory, relative to the passed root directory<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   */<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  private static Path getDefaultWorkingSnapshotDir(final Path rootDir) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return new Path(getSnapshotsDir(rootDir), SNAPSHOT_TMP_DIR_NAME);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>  /**<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * Convert the passed snapshot description into a 'full' snapshot description based on default<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * parameters, if none have been supplied. This resolves any 'optional' parameters that aren't<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * supplied to their default values.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * @param snapshot general snapshot descriptor<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @param conf Configuration to read configured snapshot defaults if snapshot is not complete<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @return a valid snapshot description<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   * @throws IllegalArgumentException if the {@link SnapshotDescription} is not a complete<a name="line.299"></a>
+<span class="sourceLineNo">300</span>   *           {@link SnapshotDescription}.<a name="line.300"></a>
+<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public static SnapshotDescription validate(SnapshotDescription snapshot, Configuration conf)<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      throws IllegalArgumentException, IOException {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (!snapshot.hasTable()) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      throw new IllegalArgumentException(<a name="line.305"></a>
+<span class="sourceLineNo">306</span>          "Descriptor doesn't apply to a table, so we can't build it.");<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // set the creation time, if one hasn't been set<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    long time = snapshot.getCreationTime();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (time == SnapshotDescriptionUtils.NO_SNAPSHOT_START_TIME_SPECIFIED) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      time = EnvironmentEdgeManager.currentTime();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      LOG.debug("Creation time not specified, setting to:" + time + " (current time:"<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          + EnvironmentEdgeManager.currentTime() + ").");<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      SnapshotDescription.Builder builder = snapshot.toBuilder();<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      builder.setCreationTime(time);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      snapshot = builder.build();<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>    // set the acl to snapshot if security feature is enabled.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    if (isSecurityAvailable(conf)) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      snapshot = writeAclToSnapshotDescription(snapshot, conf);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    return snapshot;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  }<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>   * Write the snapshot description into the working directory of a snapshot<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @param snapshot description of the snapshot being taken<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param workingDir working directory of the snapshot<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * @param fs {@link FileSystem} on which the snapshot should be taken<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * @throws IOException if we can't reach the filesystem and the file cannot be cleaned up on<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   *           failure<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public static void writeSnapshotInfo(SnapshotDescription snapshot, Path workingDir, FileSystem fs)<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      throws IOException {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    Path snapshotInfo = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOTINFO_FILE);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    try {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      FSDataOutputStream out = FSUtils.create(fs, snapshotInfo, perms, true);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        snapshot.writeTo(out);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      } finally {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        out.close();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      }<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    } catch (IOException e) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      // if we get an exception, try to remove the snapshot info<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      if (!fs.delete(snapshotInfo, false)) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        String msg = "Couldn't delete snapshot info file: " + snapshotInfo;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.error(msg);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        throw new IOException(msg);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<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>   * Create in-progress tag under .tmp of in-progress snapshot<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  public static void createInProgressTag(Path workingDir, FileSystem fs) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Path snapshot_in_progress = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOT_IN_PROGRESS);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    FSUtils.create(fs, snapshot_in_progress, perms, true);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  }<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>   * Read in the {@link org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription} stored for the snapshot in the passed directory<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @param fs filesystem where the snapshot was taken<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * @param snapshotDir directory where the snapshot was stored<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * @return the stored snapshot description<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * @throws CorruptedSnapshotException if the<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * snapshot cannot be read<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public static SnapshotDescription readSnapshotInfo(FileSystem fs, Path snapshotDir)<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      throws CorruptedSnapshotException {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    Path snapshotInfo = new Path(snapshotDir, SNAPSHOTINFO_FILE);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    try {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      FSDataInputStream in = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      try {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        in = fs.open(snapshotInfo);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        SnapshotDescription desc = SnapshotDescription.parseFrom(in);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        return desc;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      } finally {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        if (in != null) in.close();<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>      throw new CorruptedSnapshotException("Couldn't read snapshot info from:" + snapshotInfo, e);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Move the finished snapshot to its final, publicly visible directory - this marks the snapshot<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * as 'complete'.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param snapshot description of the snapshot being tabken<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @param rootdir root directory of the hbase installation<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * @param workingDir directory where the in progress snapshot was built<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @param fs {@link FileSystem} where the snapshot was built<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * @throws org.apache.hadoop.hbase.snapshot.SnapshotCreationException if the<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * snapshot could not be moved<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * @throws IOException the filesystem could not be reached<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   */<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  public static void completeSnapshot(SnapshotDescription snapshot, Path rootdir, Path workingDir,<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      FileSystem fs) throws SnapshotCreationException, IOException {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    Path finishedDir = getCompletedSnapshotDir(snapshot, rootdir);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    LOG.debug("Snapshot is done, just moving the snapshot from " + workingDir + " to "<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        + finishedDir);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    if (!fs.rename(workingDir, finishedDir)) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      throw new SnapshotCreationException(<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          "Failed to move working directory(" + workingDir + ") to completed directory("<a name="line.410"></a>
+<span class="sourceLineNo">411</span>              + finishedDir + ").", ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /**<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * Check if the user is this table snapshot's owner<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * @param snapshot the table snapshot description<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * @param user the user<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * @return true if the user is the owner of the snapshot,<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   *         false otherwise or the snapshot owner field is not present.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   */<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  public static boolean isSnapshotOwner(org.apache.hadoop.hbase.client.SnapshotDescription snapshot,<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      User user) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    if (user == null) return false;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    return user.getShortName().equals(snapshot.getOwner());<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  public static boolean isSecurityAvailable(Configuration conf) throws IOException {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    try (Connection conn = ConnectionFactory.createConnection(conf)) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      try (Admin admin = conn.getAdmin()) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        return admin.tableExists(AccessControlLists.ACL_TABLE_NAME);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static SnapshotDescription writeAclToSnapshotDescription(SnapshotDescription snapshot,<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      Configuration conf) throws IOException {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    ListMultimap&lt;String, TablePermission&gt; perms =<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        User.runAsLoginUser(new PrivilegedExceptionAction&lt;ListMultimap&lt;String, TablePermission&gt;&gt;() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>          @Override<a name="line.440"></a>
+<span class="sourceLineNo">441</span>          public ListMultimap&lt;String, TablePermission&gt; run() throws Exception {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>            return AccessControlLists.getTablePermissions(conf,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>              TableName.valueOf(snapshot.getTable()));<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>    return snapshot.toBuilder()<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        .setUsersAndPermissions(ShadedAccessControlUtil.toUserTablePermissions(perms)).build();<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span>}<a name="line.449"></a>
 
 
 


[16/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html
new file mode 100644
index 0000000..5273b00
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html
@@ -0,0 +1,391 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestExportSnapshotWithTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestExportSnapshotWithTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":9,"i1":9,"i2":9};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestExportSnapshotWithTemporaryDirectory.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestExportSnapshotWithTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.snapshot.TestExportSnapshot">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.snapshot</div>
+<h2 title="Class TestExportSnapshotWithTemporaryDirectory" class="title">Class TestExportSnapshotWithTemporaryDirectory</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">org.apache.hadoop.hbase.snapshot.TestExportSnapshot</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#line.34">TestExportSnapshotWithTemporaryDirectory</a>
+extends <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshot</a></pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested.class.summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.snapshot.TestExportSnapshot">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshot</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.RegionPredicate.html" title="interface in org.apache.hadoop.hbase.snapshot">TestExportSnapshot.RegionPredicate</a></code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#TEMP_DIR">TEMP_DIR</a></span></code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.snapshot.TestExportSnapshot">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshot</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#FAMILY">FAMILY</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#tableName">tableName</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#TEST_UTIL">TEST_UTIL</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testName">testName</a></code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#TestExportSnapshotWithTemporaryDirectory--">TestExportSnapshotWithTemporaryDirectory</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</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="t1" class="tableTab"><span><a href="javascript:show(1);">Static 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>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#setUpBaseConf-org.apache.hadoop.conf.Configuration-">setUpBaseConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#setUpBeforeClass--">setUpBeforeClass</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#tearDownAfterClass--">tearDownAfterClass</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.snapshot.TestExportSnapshot">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshot</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#createTable--">createTable</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#getBypassRegionPredicate--">getBypassRegionPredicate</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#setUp--">setUp</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#tearDown--">tearDown</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testConsecutiveExports--">testConsecutiveExports</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testEmptyExportFileSystemState--">testEmptyExportFileSystemState</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportFailure--">testExportFailure</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportFileSystemState--">testExport
 FileSystemState</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportFileSystemState-org.apache.hadoop.conf.Configuration-org.apache.hadoop.hbase.TableName-byte:A-byte:A-int-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-boolean-org.apache.hadoop.hbase.snapshot.TestExportSnapshot.RegionPredicate-boolean-">testExportFileSystemState</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportFileSystemState-org.apache.hadoop.hbase.TableName-byte:A-byte:A-int-org.apache.hadoop.fs.Path-boolean-">testExportFileSystemState</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportFileSystemStateWithSkipTmp--">testExportFileSystemStateWithSkipTmp</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportRetry--">testExportRetry</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#testExportWithTarget
 Name--">testExportWithTargetName</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#verifySnapshot-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.TableName-java.lang.String-org.apache.hadoop.hbase.snapshot.TestExportSnapshot.RegionPredicate-">verifySnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#verifySnapshot-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.TableName-java.lang.String-">verifySnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#verifySnapshotDir-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">verifySnapshotDir</a></code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <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>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CLASS_RULE</h4>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#line.37">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="TEMP_DIR">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TEMP_DIR</h4>
+<pre>protected static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#line.40">TEMP_DIR</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestExportSnapshotWithTemporaryDirectory--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestExportSnapshotWithTemporaryDirectory</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#line.34">TestExportSnapshotWithTemporaryDirectory</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="setUpBeforeClass--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUpBeforeClass</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#line.44">setUpBeforeClass</a>()
+                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="tearDownAfterClass--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDownAfterClass</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#line.51">tearDownAfterClass</a>()
+                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="setUpBaseConf-org.apache.hadoop.conf.Configuration-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>setUpBaseConf</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#line.56">setUpBaseConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestExportSnapshotWithTemporaryDirectory.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestExportSnapshotWithTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.snapshot.TestExportSnapshot">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html
index b9c51e3..261008d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -706,7 +706,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
index 6a58d0e..de21e97 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":9,"i2":10,"i3":10};
+var methods = {"i0":10,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.47">TestSnapshotDescriptionUtils</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.48">TestSnapshotDescriptionUtils</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Test that the <code>SnapshotProtos.SnapshotDescription</code> helper is helping correctly.</div>
 </li>
@@ -199,6 +199,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#testIsSubDirectoryWorks--">testIsSubDirectoryWorks</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#testIsWithinWorkingDir--">testIsWithinWorkingDir</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#testValidateMissingTableName--">testValidateMissingTableName</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -229,7 +237,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.50">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.51">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="UTIL">
@@ -238,7 +246,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.53">UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.54">UTIL</a></pre>
 </li>
 </ul>
 <a name="fs">
@@ -247,7 +255,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>fs</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.54">fs</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.55">fs</a></pre>
 </li>
 </ul>
 <a name="root">
@@ -256,7 +264,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>root</h4>
-<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.55">root</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.56">root</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -265,7 +273,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.76">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.77">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -282,7 +290,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestSnapshotDescriptionUtils</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.47">TestSnapshotDescriptionUtils</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.48">TestSnapshotDescriptionUtils</a>()</pre>
 </li>
 </ul>
 </li>
@@ -299,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setupFS</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.58">setupFS</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.59">setupFS</a>()
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -313,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupFS</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.64">cleanupFS</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.65">cleanupFS</a>()
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -327,7 +335,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testValidateMissingTableName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.79">testValidateMissingTableName</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.80">testValidateMissingTableName</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -338,10 +346,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testCompleteSnapshotWithNoSnapshotDirectoryFailure--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testCompleteSnapshotWithNoSnapshotDirectoryFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.96">testCompleteSnapshotWithNoSnapshotDirectoryFailure</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.97">testCompleteSnapshotWithNoSnapshotDirectoryFailure</a>()
                                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test that we throw an exception if there is no working snapshot directory when we attempt to
  'complete' the snapshot</div>
@@ -351,6 +359,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testIsSubDirectoryWorks--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testIsSubDirectoryWorks</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.113">testIsSubDirectoryWorks</a>()</pre>
+</li>
+</ul>
+<a name="testIsWithinWorkingDir--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testIsWithinWorkingDir</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#line.139">testIsWithinWorkingDir</a>()</pre>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshot.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshot.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshot.html
index 9d411f0..1e7ce79 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshot.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshot.html
@@ -104,17 +104,21 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobExportSnapshot</a></span></code>
 <div class="block">Test Export Snapshot Tool</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/snapshot/TestMobSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobSecureExportSnapshot</a></span></code>
 <div class="block">Reruns TestMobExportSnapshot using MobExportSnapshot in secure mode.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestSecureExportSnapshot</a></span></code>
 <div class="block">Reruns TestExportSnapshot using ExportSnapshot in secure mode.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshotWithTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshotWithTemporaryDirectory.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshotWithTemporaryDirectory.html
new file mode 100644
index 0000000..7a5a9da
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshotWithTemporaryDirectory.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshotWithTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestExportSnapshotWithTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory" class="title">Uses of Class<br>org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/snapshot/class-use/TestExportSnapshotWithTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestExportSnapshotWithTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-frame.html
index bb6f0c9..749a61f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-frame.html
@@ -26,6 +26,7 @@
 <li><a href="TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestExportSnapshot</a></li>
 <li><a href="TestExportSnapshotHelpers.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestExportSnapshotHelpers</a></li>
 <li><a href="TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestExportSnapshotNoCluster</a></li>
+<li><a href="TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestExportSnapshotWithTemporaryDirectory</a></li>
 <li><a href="TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestFlushSnapshotFromClient</a></li>
 <li><a href="TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestMobExportSnapshot</a></li>
 <li><a href="TestMobFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestMobFlushSnapshotFromClient</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-summary.html
index 2830f9e..87bcf2c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-summary.html
@@ -142,24 +142,28 @@
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestFlushSnapshotFromClient</a></td>
 <td class="colLast">
 <div class="block">Test creating/using/deleting snapshots from the client</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobExportSnapshot</a></td>
 <td class="colLast">
 <div class="block">Test Export Snapshot Tool</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobFlushSnapshotFromClient</a></td>
 <td class="colLast">
 <div class="block">Test creating/using/deleting snapshots from the client</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobRestoreFlushSnapshotFromClient</a></td>
 <td class="colLast">
 <div class="block">Test clone/restore snapshots from the client
@@ -167,25 +171,25 @@
  TODO This is essentially a clone of TestRestoreSnapshotFromClient.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobRestoreSnapshotHelper.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobRestoreSnapshotHelper</a></td>
 <td class="colLast">
 <div class="block">Test the restore/clone operation from a file-system point of view.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobSecureExportSnapshot</a></td>
 <td class="colLast">
 <div class="block">Reruns TestMobExportSnapshot using MobExportSnapshot in secure mode.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html" title="class in org.apache.hadoop.hbase.snapshot">TestRegionSnapshotTask</a></td>
 <td class="colLast">
 <div class="block">Testing the region snapshot task on a cluster.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestRestoreFlushSnapshotFromClient</a></td>
 <td class="colLast">
 <div class="block">Test clone/restore snapshots from the client
@@ -193,33 +197,33 @@
  TODO This is essentially a clone of TestRestoreSnapshotFromClient.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.html" title="class in org.apache.hadoop.hbase.snapshot">TestRestoreSnapshotHelper</a></td>
 <td class="colLast">
 <div class="block">Test the restore/clone operation from a file-system point of view.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestSecureExportSnapshot</a></td>
 <td class="colLast">
 <div class="block">Reruns TestExportSnapshot using ExportSnapshot in secure mode.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotClientRetries</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.MasterSyncObserver.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotClientRetries.MasterSyncObserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotDescriptionUtils</a></td>
 <td class="colLast">
 <div class="block">Test that the <code>SnapshotProtos.SnapshotDescription</code> helper is helping correctly.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-tree.html
index 188c553..511e7fc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-tree.html
@@ -92,6 +92,7 @@
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.SnapshotMock.SnapshotBuilder.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">SnapshotTestingUtils.SnapshotMock.SnapshotBuilder</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestExportSnapshot</span></a>
 <ul>
+<li type="circle">org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestExportSnapshotWithTemporaryDirectory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestMobExportSnapshot</span></a>
 <ul>
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestMobSecureExportSnapshot</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index f42becb..3345f54 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,8 +253,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index b21ae88..9e0700e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -141,9 +141,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index c2cff41..994c5c6 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -2665,6 +2665,7 @@
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="org/apache/hadoop/hbase/regionserver/querymatcher/TestExplicitColumnTracker.html" title="class in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">TestExplicitColumnTracker</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestExportSnapshot</span></a>
 <ul>
+<li type="circle">org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestExportSnapshotWithTemporaryDirectory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestMobExportSnapshot</span></a>
 <ul>
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestMobSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestMobSecureExportSnapshot</span></a></li>
@@ -3594,6 +3595,12 @@
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestSnapshotManifest</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotMetadata</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestSnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">TestSnapshotQuotaObserverChore</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotTemporaryDirectory</span></a>
+<ul>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotDFSTemporaryDirectory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotTemporaryDirectoryWithRegionReplicas</span></a></li>
+</ul>
+</li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotWithAcl.AccessReadAction</span></a> (implements org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">TestSnapshotWithAcl.AccessWriteAction</span></a> (implements org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/SecureTestUtil.AccessTestAction.html" title="interface in org.apache.hadoop.hbase.security.access">SecureTestUtil.AccessTestAction</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/TestSortedList.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">TestSortedList</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html
new file mode 100644
index 0000000..5af8caf
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html
@@ -0,0 +1,151 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.client;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import java.io.IOException;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.util.UUID;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.apache.hadoop.conf.Configuration;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.fs.Path;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.HConstants;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.junit.BeforeClass;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.junit.ClassRule;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.junit.experimental.categories.Category;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * This class tests that the use of a temporary snapshot directory supports snapshot functionality<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * while the temporary directory is on the same file system as the root directory<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * &lt;p&gt;<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * This is an end-to-end test for the snapshot utility<a name="line.38"></a>
+<span class="sourceLineNo">039</span> */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>@Category(LargeTests.class)<a name="line.40"></a>
+<span class="sourceLineNo">041</span>public class TestSnapshotDFSTemporaryDirectory<a name="line.41"></a>
+<span class="sourceLineNo">042</span>    extends TestSnapshotTemporaryDirectory {<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>  @ClassRule<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.45"></a>
+<span class="sourceLineNo">046</span>      HBaseClassTestRule.forClass(TestSnapshotDFSTemporaryDirectory.class);<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>   * Setup the config for the cluster<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   *<a name="line.50"></a>
+<span class="sourceLineNo">051</span>   * @throws Exception on failure<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   */<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  @BeforeClass public static void setupCluster() throws Exception {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    setupConf(UTIL.getConfiguration());<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    UTIL.startMiniCluster(NUM_RS);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    admin = UTIL.getHBaseAdmin();<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>  private static void setupConf(Configuration conf) throws IOException {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    // disable the ui<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    conf.setInt("hbase.regionsever.info.port", -1);<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    // change the flush size to a small amount, regulating number of store files<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    conf.setInt("hbase.hregion.memstore.flush.size", 25000);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    // so make sure we get a compaction when doing a load, but keep around some<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    // files in the store<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    conf.setInt("hbase.hstore.compaction.min", 10);<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    conf.setInt("hbase.hstore.compactionThreshold", 10);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    // block writes if we get to 12 store files<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    conf.setInt("hbase.hstore.blockingStoreFiles", 12);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    // Enable snapshot<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    conf.setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY,<a name="line.72"></a>
+<span class="sourceLineNo">073</span>        ConstantSizeRegionSplitPolicy.class.getName());<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>    conf.set(SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR, UTIL.getDefaultRootDirPath().toString()<a name="line.75"></a>
+<span class="sourceLineNo">076</span>        + Path.SEPARATOR + UUID.randomUUID().toString() + Path.SEPARATOR + ".tmpdir"<a name="line.76"></a>
+<span class="sourceLineNo">077</span>        + Path.SEPARATOR);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  }<a name="line.78"></a>
+<span class="sourceLineNo">079</span>}<a name="line.79"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


[24/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
index 025b084..b9f473a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html
@@ -89,504 +89,517 @@
 <span class="sourceLineNo">081</span>  private final ForeignExceptionSnare monitor;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  private final Configuration conf;<a name="line.82"></a>
 <span class="sourceLineNo">083</span>  private final Path workingDir;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private final FileSystem fs;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private int manifestSizeLimit;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private SnapshotManifest(final Configuration conf, final FileSystem fs,<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      final ForeignExceptionSnare monitor) {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    this.monitor = monitor;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    this.desc = desc;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    this.workingDir = workingDir;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    this.conf = conf;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    this.fs = fs;<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>    this.manifestSizeLimit = conf.getInt(SNAPSHOT_MANIFEST_SIZE_LIMIT_CONF_KEY, 64 * 1024 * 1024);<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>   * Return a SnapshotManifest instance, used for writing a snapshot.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   *<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * There are two usage pattern:<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   *  - The Master will create a manifest, add the descriptor, offline regions<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   *    and consolidate the snapshot by writing all the pending stuff on-disk.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   *      manifest = SnapshotManifest.create(...)<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   *      manifest.addRegion(tableDir, hri)<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *      manifest.consolidate()<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   *  - The RegionServer will create a single region manifest<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   *      manifest = SnapshotManifest.create(...)<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   *      manifest.addRegion(region)<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  public static SnapshotManifest create(final Configuration conf, final FileSystem fs,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      final ForeignExceptionSnare monitor) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return new SnapshotManifest(conf, fs, workingDir, desc, monitor);<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Return a SnapshotManifest instance with the information already loaded in-memory.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   *    SnapshotManifest manifest = SnapshotManifest.open(...)<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   *    TableDescriptor htd = manifest.getTableDescriptor()<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   *    for (SnapshotRegionManifest regionManifest: manifest.getRegionManifests())<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   *      hri = regionManifest.getRegionInfo()<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   *      for (regionManifest.getFamilyFiles())<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>  public static SnapshotManifest open(final Configuration conf, final FileSystem fs,<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      final Path workingDir, final SnapshotDescription desc) throws IOException {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    SnapshotManifest manifest = new SnapshotManifest(conf, fs, workingDir, desc, null);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    manifest.load();<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return manifest;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * Add the table descriptor to the snapshot manifest<a name="line.137"></a>
+<span class="sourceLineNo">084</span>  private final FileSystem rootFs;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final FileSystem workingDirFs;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private int manifestSizeLimit;<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>   * @param conf configuration file for HBase setup<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * @param rootFs root filesystem containing HFiles<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * @param workingDir file path of where the manifest should be located<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * @param desc description of snapshot being taken<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * @param monitor monitor of foreign exceptions<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * @throws IOException if the working directory file system cannot be<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   *                     determined from the config file<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private SnapshotManifest(final Configuration conf, final FileSystem rootFs,<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      final ForeignExceptionSnare monitor) throws IOException {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    this.monitor = monitor;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    this.desc = desc;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    this.workingDir = workingDir;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    this.conf = conf;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    this.rootFs = rootFs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    this.workingDirFs = this.workingDir.getFileSystem(this.conf);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    this.manifestSizeLimit = conf.getInt(SNAPSHOT_MANIFEST_SIZE_LIMIT_CONF_KEY, 64 * 1024 * 1024);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  }<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>   * Return a SnapshotManifest instance, used for writing a snapshot.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   *<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * There are two usage pattern:<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   *  - The Master will create a manifest, add the descriptor, offline regions<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   *    and consolidate the snapshot by writing all the pending stuff on-disk.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   *      manifest = SnapshotManifest.create(...)<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   *      manifest.addRegion(tableDir, hri)<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *      manifest.consolidate()<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   *  - The RegionServer will create a single region manifest<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   *      manifest = SnapshotManifest.create(...)<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   *      manifest.addRegion(region)<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  public static SnapshotManifest create(final Configuration conf, final FileSystem fs,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      final Path workingDir, final SnapshotDescription desc,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      final ForeignExceptionSnare monitor) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    return new SnapshotManifest(conf, fs, workingDir, desc, monitor);<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Return a SnapshotManifest instance with the information already loaded in-memory.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   *    SnapshotManifest manifest = SnapshotManifest.open(...)<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   *    TableDescriptor htd = manifest.getTableDescriptor()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   *    for (SnapshotRegionManifest regionManifest: manifest.getRegionManifests())<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   *      hri = regionManifest.getRegionInfo()<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   *      for (regionManifest.getFamilyFiles())<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   *        ...<a name="line.137"></a>
 <span class="sourceLineNo">138</span>   */<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void addTableDescriptor(final TableDescriptor htd) throws IOException {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.htd = htd;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>  interface RegionVisitor&lt;TRegion, TFamily&gt; {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    TRegion regionOpen(final RegionInfo regionInfo) throws IOException;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    void regionClose(final TRegion region) throws IOException;<a name="line.145"></a>
+<span class="sourceLineNo">139</span>  public static SnapshotManifest open(final Configuration conf, final FileSystem fs,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      final Path workingDir, final SnapshotDescription desc) throws IOException {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    SnapshotManifest manifest = new SnapshotManifest(conf, fs, workingDir, desc, null);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    manifest.load();<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return manifest;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
 <span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>    TFamily familyOpen(final TRegion region, final byte[] familyName) throws IOException;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    void familyClose(final TRegion region, final TFamily family) throws IOException;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void storeFile(final TRegion region, final TFamily family, final StoreFileInfo storeFile)<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      throws IOException;<a name="line.151"></a>
+<span class="sourceLineNo">147</span>  /**<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * Add the table descriptor to the snapshot manifest<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   */<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public void addTableDescriptor(final TableDescriptor htd) throws IOException {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    this.htd = htd;<a name="line.151"></a>
 <span class="sourceLineNo">152</span>  }<a name="line.152"></a>
 <span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private RegionVisitor createRegionVisitor(final SnapshotDescription desc) throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    switch (getSnapshotFormat(desc)) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION:<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        return new SnapshotManifestV1.ManifestBuilder(conf, fs, workingDir);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION:<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        return new SnapshotManifestV2.ManifestBuilder(conf, fs, workingDir);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      default:<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public void addMobRegion(RegionInfo regionInfo) throws IOException {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    // Visit the region and add it to the manifest<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addMobRegion(regionInfo, visitor);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  @VisibleForTesting<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  protected void addMobRegion(RegionInfo regionInfo, RegionVisitor visitor) throws IOException {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // 1. dump region meta info into the snapshot directory<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    LOG.debug("Storing mob region '" + regionInfo + "' region-info for snapshot.");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    Object regionData = visitor.regionOpen(regionInfo);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    monitor.rethrowException();<a name="line.179"></a>
+<span class="sourceLineNo">154</span>  interface RegionVisitor&lt;TRegion, TFamily&gt; {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    TRegion regionOpen(final RegionInfo regionInfo) throws IOException;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    void regionClose(final TRegion region) throws IOException;<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    TFamily familyOpen(final TRegion region, final byte[] familyName) throws IOException;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    void familyClose(final TRegion region, final TFamily family) throws IOException;<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    void storeFile(final TRegion region, final TFamily family, final StoreFileInfo storeFile)<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throws IOException;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  private RegionVisitor createRegionVisitor(final SnapshotDescription desc) throws IOException {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    switch (getSnapshotFormat(desc)) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION:<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        return new SnapshotManifestV1.ManifestBuilder(conf, rootFs, workingDir);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION:<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        return new SnapshotManifestV2.ManifestBuilder(conf, rootFs, workingDir);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      default:<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public void addMobRegion(RegionInfo regionInfo) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.179"></a>
 <span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>    // 2. iterate through all the stores in the region<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    LOG.debug("Creating references for mob files");<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    Path mobRegionPath = MobUtils.getMobRegionPath(conf, regionInfo.getTable());<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // 2.1. build the snapshot reference for the store if it's a mob store<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      if (!hcd.isMobEnabled()) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        continue;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      Object familyData = visitor.familyOpen(regionData, hcd.getName());<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      monitor.rethrowException();<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>      Path storePath = MobUtils.getMobFamilyPath(mobRegionPath, hcd.getNameAsString());<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      List&lt;StoreFileInfo&gt; storeFiles = getStoreFiles(storePath);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      if (storeFiles == null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        if (LOG.isDebugEnabled()) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>          LOG.debug("No mob files under family: " + hcd.getNameAsString());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        }<a name="line.198"></a>
+<span class="sourceLineNo">181</span>    // Visit the region and add it to the manifest<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addMobRegion(regionInfo, visitor);<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>  @VisibleForTesting<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  protected void addMobRegion(RegionInfo regionInfo, RegionVisitor visitor) throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // 1. dump region meta info into the snapshot directory<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    LOG.debug("Storing mob region '" + regionInfo + "' region-info for snapshot.");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    Object regionData = visitor.regionOpen(regionInfo);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    monitor.rethrowException();<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    // 2. iterate through all the stores in the region<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    LOG.debug("Creating references for mob files");<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>    Path mobRegionPath = MobUtils.getMobRegionPath(conf, regionInfo.getTable());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      // 2.1. build the snapshot reference for the store if it's a mob store<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      if (!hcd.isMobEnabled()) {<a name="line.198"></a>
 <span class="sourceLineNo">199</span>        continue;<a name="line.199"></a>
 <span class="sourceLineNo">200</span>      }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>      addReferenceFiles(visitor, regionData, familyData, storeFiles, true);<a name="line.202"></a>
+<span class="sourceLineNo">201</span>      Object familyData = visitor.familyOpen(regionData, hcd.getName());<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      monitor.rethrowException();<a name="line.202"></a>
 <span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>      visitor.familyClose(regionData, familyData);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    visitor.regionClose(regionData);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Creates a 'manifest' for the specified region, by reading directly from the HRegion object.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * This is used by the "online snapshot" when the table is enabled.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  public void addRegion(final HRegion region) throws IOException {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // Visit the region and add it to the manifest<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    addRegion(region, visitor);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>  @VisibleForTesting<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  protected void addRegion(final HRegion region, RegionVisitor visitor) throws IOException {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    // 1. dump region meta info into the snapshot directory<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    LOG.debug("Storing '" + region + "' region-info for snapshot.");<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    Object regionData = visitor.regionOpen(region.getRegionInfo());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    monitor.rethrowException();<a name="line.226"></a>
+<span class="sourceLineNo">204</span>      Path storePath = MobUtils.getMobFamilyPath(mobRegionPath, hcd.getNameAsString());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      List&lt;StoreFileInfo&gt; storeFiles = getStoreFiles(storePath);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      if (storeFiles == null) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        if (LOG.isDebugEnabled()) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>          LOG.debug("No mob files under family: " + hcd.getNameAsString());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        continue;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>      addReferenceFiles(visitor, regionData, familyData, storeFiles, true);<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>      visitor.familyClose(regionData, familyData);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    visitor.regionClose(regionData);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Creates a 'manifest' for the specified region, by reading directly from the HRegion object.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * This is used by the "online snapshot" when the table is enabled.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public void addRegion(final HRegion region) throws IOException {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.226"></a>
 <span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>    // 2. iterate through all the stores in the region<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    LOG.debug("Creating references for hfiles");<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    for (HStore store : region.getStores()) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      // 2.1. build the snapshot reference for the store<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      Object familyData = visitor.familyOpen(regionData,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          store.getColumnFamilyDescriptor().getName());<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      monitor.rethrowException();<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>      List&lt;HStoreFile&gt; storeFiles = new ArrayList&lt;&gt;(store.getStorefiles());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (LOG.isDebugEnabled()) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
+<span class="sourceLineNo">228</span>    // Visit the region and add it to the manifest<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    addRegion(region, visitor);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @VisibleForTesting<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  protected void addRegion(final HRegion region, RegionVisitor visitor) throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // 1. dump region meta info into the snapshot directory<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.debug("Storing '" + region + "' region-info for snapshot.");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    Object regionData = visitor.regionOpen(region.getRegionInfo());<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    monitor.rethrowException();<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // 2. iterate through all the stores in the region<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    LOG.debug("Creating references for hfiles");<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>      // 2.2. iterate through all the store's files and create "references".<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      for (int i = 0, sz = storeFiles.size(); i &lt; sz; i++) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        HStoreFile storeFile = storeFiles.get(i);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        monitor.rethrowException();<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>        // create "reference" to this store file.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        LOG.debug("Adding reference for file (" + (i+1) + "/" + sz + "): " + storeFile.getPath());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        visitor.storeFile(regionData, familyData, storeFile.getFileInfo());<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      visitor.familyClose(regionData, familyData);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    visitor.regionClose(regionData);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Creates a 'manifest' for the specified region, by reading directly from the disk.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * This is used by the "offline snapshot" when the table is disabled.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  public void addRegion(final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // Visit the region and add it to the manifest<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    addRegion(tableDir, regionInfo, visitor);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @VisibleForTesting<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  protected void addRegion(final Path tableDir, final RegionInfo regionInfo, RegionVisitor visitor)<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      throws IOException {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    boolean isMobRegion = MobUtils.isMobRegionInfo(regionInfo);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    try {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      Path baseDir = tableDir;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      // Open the RegionFS<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      if (isMobRegion) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        baseDir = FSUtils.getTableDir(MobUtils.getMobHome(conf), regionInfo.getTable());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, fs,<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        baseDir, regionInfo, true);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      monitor.rethrowException();<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>      // 1. dump region meta info into the snapshot directory<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      LOG.debug("Storing region-info for snapshot.");<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      Object regionData = visitor.regionOpen(regionInfo);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      monitor.rethrowException();<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>      // 2. iterate through all the stores in the region<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      LOG.debug("Creating references for hfiles");<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>      // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      // in batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      // checking to see if we have all the files until we are sure), but the limit is currently<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      // 1000 files/batch, far more than the number of store files under a single column family.<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      if (familyNames != null) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        for (String familyName: familyNames) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          Object familyData = visitor.familyOpen(regionData, Bytes.toBytes(familyName));<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          monitor.rethrowException();<a name="line.299"></a>
+<span class="sourceLineNo">242</span>    for (HStore store : region.getStores()) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      // 2.1. build the snapshot reference for the store<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      Object familyData = visitor.familyOpen(regionData,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          store.getColumnFamilyDescriptor().getName());<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      monitor.rethrowException();<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>      List&lt;HStoreFile&gt; storeFiles = new ArrayList&lt;&gt;(store.getStorefiles());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      if (LOG.isDebugEnabled()) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      }<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>      // 2.2. iterate through all the store's files and create "references".<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      for (int i = 0, sz = storeFiles.size(); i &lt; sz; i++) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        HStoreFile storeFile = storeFiles.get(i);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        monitor.rethrowException();<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // create "reference" to this store file.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        LOG.debug("Adding reference for file (" + (i+1) + "/" + sz + "): " + storeFile.getPath());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        visitor.storeFile(regionData, familyData, storeFile.getFileInfo());<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      visitor.familyClose(regionData, familyData);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    visitor.regionClose(regionData);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  }<a name="line.265"></a>
+<span class="sourceLineNo">266</span><a name="line.266"></a>
+<span class="sourceLineNo">267</span>  /**<a name="line.267"></a>
+<span class="sourceLineNo">268</span>   * Creates a 'manifest' for the specified region, by reading directly from the disk.<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * This is used by the "offline snapshot" when the table is disabled.<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  public void addRegion(final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    // Get the ManifestBuilder/RegionVisitor<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    RegionVisitor visitor = createRegionVisitor(desc);<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    // Visit the region and add it to the manifest<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    addRegion(tableDir, regionInfo, visitor);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  protected void addRegion(final Path tableDir, final RegionInfo regionInfo, RegionVisitor visitor)<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      throws IOException {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    boolean isMobRegion = MobUtils.isMobRegionInfo(regionInfo);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      Path baseDir = tableDir;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      // Open the RegionFS<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      if (isMobRegion) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        baseDir = FSUtils.getTableDir(MobUtils.getMobHome(conf), regionInfo.getTable());<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, rootFs,<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        baseDir, regionInfo, true);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      monitor.rethrowException();<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>      // 1. dump region meta info into the snapshot directory<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      LOG.debug("Storing region-info for snapshot.");<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      Object regionData = visitor.regionOpen(regionInfo);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      monitor.rethrowException();<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>      // 2. iterate through all the stores in the region<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      LOG.debug("Creating references for hfiles");<a name="line.299"></a>
 <span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>          Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          if (storeFiles == null) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>            if (LOG.isDebugEnabled()) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>              LOG.debug("No files under family: " + familyName);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>            }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            continue;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>          }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>          // 2.1. build the snapshot reference for the store<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          // iterate through all the store's files and create "references".<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          addReferenceFiles(visitor, regionData, familyData, storeFiles, false);<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>          visitor.familyClose(regionData, familyData);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      visitor.regionClose(regionData);<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    } catch (IOException e) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // the mob directory might not be created yet, so do nothing when it is a mob region<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      if (!isMobRegion) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        throw e;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private List&lt;StoreFileInfo&gt; getStoreFiles(Path storeDir) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    FileStatus[] stats = FSUtils.listStatus(fs, storeDir);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    if (stats == null) return null;<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    ArrayList&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(stats.length);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    for (int i = 0; i &lt; stats.length; ++i) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      storeFiles.add(new StoreFileInfo(conf, fs, stats[i]));<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    return storeFiles;<a name="line.333"></a>
+<span class="sourceLineNo">301</span>      // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // in batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      // checking to see if we have all the files until we are sure), but the limit is currently<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      // 1000 files/batch, far more than the number of store files under a single column family.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      if (familyNames != null) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        for (String familyName: familyNames) {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>          Object familyData = visitor.familyOpen(regionData, Bytes.toBytes(familyName));<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          monitor.rethrowException();<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>          Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>          if (storeFiles == null) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>            if (LOG.isDebugEnabled()) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>              LOG.debug("No files under family: " + familyName);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>            continue;<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>          // 2.1. build the snapshot reference for the store<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          // iterate through all the store's files and create "references".<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          addReferenceFiles(visitor, regionData, familyData, storeFiles, false);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>          visitor.familyClose(regionData, familyData);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      visitor.regionClose(regionData);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    } catch (IOException e) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      // the mob directory might not be created yet, so do nothing when it is a mob region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      if (!isMobRegion) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        throw e;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
 <span class="sourceLineNo">334</span>  }<a name="line.334"></a>
 <span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  private void addReferenceFiles(RegionVisitor visitor, Object regionData, Object familyData,<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      Collection&lt;StoreFileInfo&gt; storeFiles, boolean isMob) throws IOException {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    final String fileType = isMob ? "mob file" : "hfile";<a name="line.338"></a>
+<span class="sourceLineNo">336</span>  private List&lt;StoreFileInfo&gt; getStoreFiles(Path storeDir) throws IOException {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    FileStatus[] stats = FSUtils.listStatus(rootFs, storeDir);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    if (stats == null) return null;<a name="line.338"></a>
 <span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (LOG.isDebugEnabled()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      LOG.debug(String.format("Adding snapshot references for %s %ss", storeFiles, fileType));<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>    int i = 0;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    int sz = storeFiles.size();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    for (StoreFileInfo storeFile: storeFiles) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      monitor.rethrowException();<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>      LOG.debug(String.format("Adding reference for %s (%d/%d): %s",<a name="line.349"></a>
-<span class="sourceLineNo">350</span>          fileType, ++i, sz, storeFile.getPath()));<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>      // create "reference" to this store file.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      visitor.storeFile(regionData, familyData, storeFile);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  }<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>   * Load the information in the SnapshotManifest. Called by SnapshotManifest.open()<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   *<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * If the format is v2 and there is no data-manifest, means that we are loading an<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * in-progress snapshot. Since we support rolling-upgrades, we loook for v1 and v2<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * regions format.<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   */<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private void load() throws IOException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    switch (getSnapshotFormat(desc)) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION: {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        this.htd = FSTableDescriptors.getTableDescriptorFromFs(fs, workingDir);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>        ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        try {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>          this.regionManifests =<a name="line.370"></a>
-<span class="sourceLineNo">371</span>            SnapshotManifestV1.loadRegionManifests(conf, tpool, fs, workingDir, desc);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        } finally {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          tpool.shutdown();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        break;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION: {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        SnapshotDataManifest dataManifest = readDataManifest();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (dataManifest != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          htd = ProtobufUtil.toTableDescriptor(dataManifest.getTableSchema());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          regionManifests = dataManifest.getRegionManifestsList();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        } else {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          // Compatibility, load the v1 regions<a name="line.383"></a>
-<span class="sourceLineNo">384</span>          // This happens only when the snapshot is in-progress and the cache wants to refresh.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>          List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>          ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>          try {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>            v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, fs, workingDir, desc);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>            v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, fs, workingDir, desc,<a name="line.389"></a>
-<span class="sourceLineNo">390</span>                manifestSizeLimit);<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          } catch (InvalidProtocolBufferException e) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            throw new CorruptedSnapshotException("unable to parse region manifest " +<a name="line.392"></a>
-<span class="sourceLineNo">393</span>                e.getMessage(), e);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          } finally {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            tpool.shutdown();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          if (v1Regions != null &amp;&amp; v2Regions != null) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            regionManifests = new ArrayList&lt;&gt;(v1Regions.size() + v2Regions.size());<a name="line.398"></a>
-<span class="sourceLineNo">399</span>            regionManifests.addAll(v1Regions);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            regionManifests.addAll(v2Regions);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>          } else if (v1Regions != null) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>            regionManifests = v1Regions;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          } else /* if (v2Regions != null) */ {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>            regionManifests = v2Regions;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        break;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      default:<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * Get the current snapshot working dir<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  public Path getSnapshotDir() {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    return this.workingDir;<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  /**<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   * Get the SnapshotDescription<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public SnapshotDescription getSnapshotDescription() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    return this.desc;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * Get the table descriptor from the Snapshot<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   */<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public TableDescriptor getTableDescriptor() {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return this.htd;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>  /**<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * Get all the Region Manifest from the snapshot<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   */<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  public List&lt;SnapshotRegionManifest&gt; getRegionManifests() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    return this.regionManifests;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  /**<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * Get all the Region Manifest from the snapshot.<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * This is an helper to get a map with the region encoded name<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  public Map&lt;String, SnapshotRegionManifest&gt; getRegionManifestsMap() {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    if (regionManifests == null || regionManifests.isEmpty()) return null;<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>    HashMap&lt;String, SnapshotRegionManifest&gt; regionsMap = new HashMap&lt;&gt;(regionManifests.size());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    for (SnapshotRegionManifest manifest: regionManifests) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      String regionName = getRegionNameFromManifest(manifest);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      regionsMap.put(regionName, manifest);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return regionsMap;<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>  public void consolidate() throws IOException {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    if (getSnapshotFormat(desc) == SnapshotManifestV1.DESCRIPTOR_VERSION) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      LOG.info("Using old Snapshot Format");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // write a copy of descriptor to the snapshot directory<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      new FSTableDescriptors(conf, fs, rootDir)<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        .createTableDescriptorForTableDirectory(workingDir, htd, false);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    } else {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      LOG.debug("Convert to Single Snapshot Manifest");<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      convertToV2SingleManifest();<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><a name="line.470"></a>
-<span class="sourceLineNo">471</span>  /*<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * In case of rolling-upgrade, we try to read all the formats and build<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * the snapshot with the latest format.<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  private void convertToV2SingleManifest() throws IOException {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    // Try to load v1 and v2 regions<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    try {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, fs, workingDir, desc);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, fs, workingDir, desc,<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          manifestSizeLimit);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    } finally {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      tpool.shutdown();<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    }<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    SnapshotDataManifest.Builder dataManifestBuilder = SnapshotDataManifest.newBuilder();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    dataManifestBuilder.setTableSchema(ProtobufUtil.toTableSchema(htd));<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      dataManifestBuilder.addAllRegionManifests(v1Regions);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    if (v2Regions != null &amp;&amp; v2Regions.size() &gt; 0) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      dataManifestBuilder.addAllRegionManifests(v2Regions);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    // Write the v2 Data Manifest.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // Once the data-manifest is written, the snapshot can be considered complete.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    // Currently snapshots are written in a "temporary" directory and later<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    // moved to the "complated" snapshot directory.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    SnapshotDataManifest dataManifest = dataManifestBuilder.build();<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    writeDataManifest(dataManifest);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    this.regionManifests = dataManifest.getRegionManifestsList();<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    // Remove the region manifests. Everything is now in the data-manifest.<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    // The delete operation is "relaxed", unless we get an exception we keep going.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    // The extra files in the snapshot directory will not give any problem,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    // since they have the same content as the data manifest, and even by re-reading<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    // them we will get the same information.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      for (SnapshotRegionManifest regionManifest: v1Regions) {<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        SnapshotManifestV1.deleteRegionManifest(fs, workingDir, regionManifest);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      }<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if (v2Regions != null &amp;&amp; v2Regions.size() &gt; 0) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      for (SnapshotRegionManifest regionManifest: v2Regions) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        SnapshotManifestV2.deleteRegionManifest(fs, workingDir, regionManifest);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      }<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>  /*<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   * Write the SnapshotDataManifest file<a name="line.523"></a>
-<span class="sourceLineNo">524</span>   */<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  private void writeDataManifest(final SnapshotDataManifest manifest)<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      throws IOException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    FSDataOutputStream stream = fs.create(new Path(workingDir, DATA_MANIFEST_NAME));<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    try {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      manifest.writeTo(stream);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    } finally {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      stream.close();<a name="line.531"></a>
+<span class="sourceLineNo">340</span>    ArrayList&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(stats.length);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    for (int i = 0; i &lt; stats.length; ++i) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      storeFiles.add(new StoreFileInfo(conf, rootFs, stats[i]));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    return storeFiles;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private void addReferenceFiles(RegionVisitor visitor, Object regionData, Object familyData,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      Collection&lt;StoreFileInfo&gt; storeFiles, boolean isMob) throws IOException {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    final String fileType = isMob ? "mob file" : "hfile";<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    if (LOG.isDebugEnabled()) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      LOG.debug(String.format("Adding snapshot references for %s %ss", storeFiles, fileType));<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span><a name="line.354"></a>
+<span class="sourceLineNo">355</span>    int i = 0;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    int sz = storeFiles.size();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    for (StoreFileInfo storeFile: storeFiles) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      monitor.rethrowException();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(String.format("Adding reference for %s (%d/%d): %s",<a name="line.360"></a>
+<span class="sourceLineNo">361</span>          fileType, ++i, sz, storeFile.getPath()));<a name="line.361"></a>
+<span class="sourceLineNo">362</span><a name="line.362"></a>
+<span class="sourceLineNo">363</span>      // create "reference" to this store file.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      visitor.storeFile(regionData, familyData, storeFile);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>  /**<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * Load the information in the SnapshotManifest. Called by SnapshotManifest.open()<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   *<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * If the format is v2 and there is no data-manifest, means that we are loading an<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * in-progress snapshot. Since we support rolling-upgrades, we loook for v1 and v2<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * regions format.<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  private void load() throws IOException {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    switch (getSnapshotFormat(desc)) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      case SnapshotManifestV1.DESCRIPTOR_VERSION: {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        this.htd = FSTableDescriptors.getTableDescriptorFromFs(workingDirFs, workingDir);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        try {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          this.regionManifests =<a name="line.381"></a>
+<span class="sourceLineNo">382</span>            SnapshotManifestV1.loadRegionManifests(conf, tpool, rootFs, workingDir, desc);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        } finally {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          tpool.shutdown();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        break;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      case SnapshotManifestV2.DESCRIPTOR_VERSION: {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        SnapshotDataManifest dataManifest = readDataManifest();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        if (dataManifest != null) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          htd = ProtobufUtil.toTableDescriptor(dataManifest.getTableSchema());<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          regionManifests = dataManifest.getRegionManifestsList();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        } else {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          // Compatibility, load the v1 regions<a name="line.394"></a>
+<span class="sourceLineNo">395</span>          // This happens only when the snapshot is in-progress and the cache wants to refresh.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>          ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.397"></a>
+<span class="sourceLineNo">398</span>          try {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>            v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, rootFs,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>                workingDir, desc);<a name="line.400"></a>
+<span class="sourceLineNo">401</span>            v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, rootFs,<a name="line.401"></a>
+<span class="sourceLineNo">402</span>                workingDir, desc, manifestSizeLimit);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          } catch (InvalidProtocolBufferException e) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>            throw new CorruptedSnapshotException("unable to parse region manifest " +<a name="line.404"></a>
+<span class="sourceLineNo">405</span>                e.getMessage(), e);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          } finally {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>            tpool.shutdown();<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (v1Regions != null &amp;&amp; v2Regions != null) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            regionManifests = new ArrayList&lt;&gt;(v1Regions.size() + v2Regions.size());<a name="line.410"></a>
+<span class="sourceLineNo">411</span>            regionManifests.addAll(v1Regions);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            regionManifests.addAll(v2Regions);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } else if (v1Regions != null) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            regionManifests = v1Regions;<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          } else /* if (v2Regions != null) */ {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>            regionManifests = v2Regions;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        break;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      default:<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      throw new CorruptedSnapshotException("Invalid Snapshot version: " + desc.getVersion(),<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        ProtobufUtil.createSnapshotDesc(desc));<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Get the current snapshot working dir<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  public Path getSnapshotDir() {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    return this.workingDir;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /**<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   * Get the SnapshotDescription<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public SnapshotDescription getSnapshotDescription() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return this.desc;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>  /**<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * Get the table descriptor from the Snapshot<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  public TableDescriptor getTableDescriptor() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return this.htd;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * Get all the Region Manifest from the snapshot<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  public List&lt;SnapshotRegionManifest&gt; getRegionManifests() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return this.regionManifests;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * Get all the Region Manifest from the snapshot.<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   * This is an helper to get a map with the region encoded name<a name="line.457"></a>
+<span class="sourceLineNo">458</span>   */<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public Map&lt;String, SnapshotRegionManifest&gt; getRegionManifestsMap() {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    if (regionManifests == null || regionManifests.isEmpty()) return null;<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>    HashMap&lt;String, SnapshotRegionManifest&gt; regionsMap = new HashMap&lt;&gt;(regionManifests.size());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    for (SnapshotRegionManifest manifest: regionManifests) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      String regionName = getRegionNameFromManifest(manifest);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      regionsMap.put(regionName, manifest);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    }<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    return regionsMap;<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>  public void consolidate() throws IOException {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    if (getSnapshotFormat(desc) == SnapshotManifestV1.DESCRIPTOR_VERSION) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      Path rootDir = FSUtils.getRootDir(conf);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      LOG.info("Using old Snapshot Format");<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // write a copy of descriptor to the snapshot directory<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      new FSTableDescriptors(conf, workingDirFs, rootDir)<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        .createTableDescriptorForTableDirectory(workingDir, htd, false);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    } else {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      LOG.debug("Convert to Single Snapshot Manifest");<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      convertToV2SingleManifest();<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>   * In case of rolling-upgrade, we try to read all the formats and build<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   * the snapshot with the latest format.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  private void convertToV2SingleManifest() throws IOException {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    // Try to load v1 and v2 regions<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    List&lt;SnapshotRegionManifest&gt; v1Regions, v2Regions;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    ThreadPoolExecutor tpool = createExecutor("SnapshotManifestLoader");<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    try {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      v1Regions = SnapshotManifestV1.loadRegionManifests(conf, tpool, workingDirFs,<a name="line.492"></a>
+<span class="sourceLineNo">493</span>          workingDir, desc);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      v2Regions = SnapshotManifestV2.loadRegionManifests(conf, tpool, workingDirFs,<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          workingDir, desc, manifestSizeLimit);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    } finally {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      tpool.shutdown();<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>    SnapshotDataManifest.Builder dataManifestBuilder = SnapshotDataManifest.newBuilder();<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    dataManifestBuilder.setTableSchema(ProtobufUtil.toTableSchema(htd));<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      dataManifestBuilder.addAllRegionManifests(v1Regions);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    if (v2Regions != null &amp;&amp; v2Regions.size() &gt; 0) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      dataManifestBuilder.addAllRegionManifests(v2Regions);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span><a name="line.509"></a>
+<span class="sourceLineNo">510</span>    // Write the v2 Data Manifest.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    // Once the data-manifest is written, the snapshot can be considered complete.<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    // Currently snapshots are written in a "temporary" directory and later<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    // moved to the "complated" snapshot directory.<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    SnapshotDataManifest dataManifest = dataManifestBuilder.build();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    writeDataManifest(dataManifest);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    this.regionManifests = dataManifest.getRegionManifestsList();<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    // Remove the region manifests. Everything is now in the data-manifest.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    // The delete operation is "relaxed", unless we get an exception we keep going.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    // The extra files in the snapshot directory will not give any problem,<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // since they have the same content as the data manifest, and even by re-reading<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    // them we will get the same information.<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    if (v1Regions != null &amp;&amp; v1Regions.size() &gt; 0) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      for (SnapshotRegionManifest regionManifest: v1Regions) {<a name="line.524"><

<TRUNCATED>

[22/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
index 81c850b..1135952 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.html
@@ -77,131 +77,134 @@
 <span class="sourceLineNo">069</span>                    SnapshotRegionManifest.Builder, SnapshotRegionManifest.FamilyFiles.Builder&gt; {<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    private final Configuration conf;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private final Path snapshotDir;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private final FileSystem fs;<a name="line.72"></a>
+<span class="sourceLineNo">072</span>    private final FileSystem rootFs;<a name="line.72"></a>
 <span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>    public ManifestBuilder(final Configuration conf, final FileSystem fs, final Path snapshotDir) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      this.snapshotDir = snapshotDir;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      this.conf = conf;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      this.fs = fs;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>    @Override<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    public SnapshotRegionManifest.Builder regionOpen(final RegionInfo regionInfo) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return manifest;<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>    @Override<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    public void regionClose(final SnapshotRegionManifest.Builder region) throws IOException {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      // we should ensure the snapshot dir exist, maybe it has been deleted by master<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      // see HBASE-16464<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      if (fs.exists(snapshotDir)) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        SnapshotRegionManifest manifest = region.build();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>        FSDataOutputStream stream = fs.create(getRegionManifestPath(snapshotDir, manifest));<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        try {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>          manifest.writeTo(stream);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        } finally {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>          stream.close();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>        }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      } else {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        LOG.warn("can't write manifest without parent dir, maybe it has been deleted by master?");<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><a name="line.103"></a>
-<span class="sourceLineNo">104</span>    @Override<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    public SnapshotRegionManifest.FamilyFiles.Builder familyOpen(<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        final SnapshotRegionManifest.Builder region, final byte[] familyName) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.107"></a>
-<span class="sourceLineNo">108</span>          SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      family.setFamilyName(UnsafeByteOperations.unsafeWrap(familyName));<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      return family;<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 familyClose(final SnapshotRegionManifest.Builder region,<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        final SnapshotRegionManifest.FamilyFiles.Builder family) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      region.addFamilyFiles(family.build());<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    public void storeFile(final SnapshotRegionManifest.Builder region,<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        final SnapshotRegionManifest.FamilyFiles.Builder family, final StoreFileInfo storeFile)<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>            SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      sfManifest.setName(storeFile.getPath().getName());<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      if (storeFile.isReference()) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        sfManifest.setReference(storeFile.getReference().convert());<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      sfManifest.setFileSize(storeFile.getReferencedFileStatus(fs).getLen());<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      family.addStoreFiles(sfManifest.build());<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><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final Executor executor, final FileSystem fs, final Path snapshotDir,<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      final SnapshotDescription desc, final int manifestSizeLimit) throws IOException {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    FileStatus[] manifestFiles = FSUtils.listStatus(fs, snapshotDir, new PathFilter() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      public boolean accept(Path path) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        return path.getName().startsWith(SNAPSHOT_MANIFEST_PREFIX);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>    if (manifestFiles == null || manifestFiles.length == 0) return null;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    for (final FileStatus st: manifestFiles) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          FSDataInputStream stream = fs.open(st.getPath());<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          CodedInputStream cin = CodedInputStream.newInstance(stream);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          cin.setSizeLimit(manifestSizeLimit);<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>          try {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>            return SnapshotRegionManifest.parseFrom(cin);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          } finally {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>            stream.close();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>          }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      });<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(manifestFiles.length);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    try {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      for (int i = 0; i &lt; manifestFiles.length; ++i) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        regionsManifest.add(completionService.take().get());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } catch (InterruptedException e) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      throw new InterruptedIOException(e.getMessage());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    } catch (ExecutionException e) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Throwable t = e.getCause();<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>      if(t instanceof InvalidProtocolBufferException) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        throw (InvalidProtocolBufferException)t;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      } else {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        IOException ex = new IOException("ExecutionException");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        ex.initCause(e.getCause());<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        throw ex;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return regionsManifest;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    fs.delete(getRegionManifestPath(snapshotDir, manifest), true);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static Path getRegionManifestPath(final Path snapshotDir,<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      final SnapshotRegionManifest manifest) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    return new Path(snapshotDir, SNAPSHOT_MANIFEST_PREFIX + regionName);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>}<a name="line.196"></a>
+<span class="sourceLineNo">074</span>    public ManifestBuilder(final Configuration conf, final FileSystem rootFs,<a name="line.74"></a>
+<span class="sourceLineNo">075</span>        final Path snapshotDir) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      this.snapshotDir = snapshotDir;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      this.conf = conf;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      this.rootFs = rootFs;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>    @Override<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    public SnapshotRegionManifest.Builder regionOpen(final RegionInfo regionInfo) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return manifest;<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>    @Override<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    public void regionClose(final SnapshotRegionManifest.Builder region) throws IOException {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      // we should ensure the snapshot dir exist, maybe it has been deleted by master<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      // see HBASE-16464<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      FileSystem workingDirFs = snapshotDir.getFileSystem(this.conf);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      if (workingDirFs.exists(snapshotDir)) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        SnapshotRegionManifest manifest = region.build();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>        FSDataOutputStream stream = workingDirFs.create(<a name="line.95"></a>
+<span class="sourceLineNo">096</span>            getRegionManifestPath(snapshotDir, manifest));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        try {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>          manifest.writeTo(stream);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        } finally {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>          stream.close();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        }<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      } else {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        LOG.warn("can't write manifest without parent dir, maybe it has been deleted by master?");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      }<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public SnapshotRegionManifest.FamilyFiles.Builder familyOpen(<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        final SnapshotRegionManifest.Builder region, final byte[] familyName) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.110"></a>
+<span class="sourceLineNo">111</span>          SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      family.setFamilyName(UnsafeByteOperations.unsafeWrap(familyName));<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      return family;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    @Override<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    public void familyClose(final SnapshotRegionManifest.Builder region,<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        final SnapshotRegionManifest.FamilyFiles.Builder family) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      region.addFamilyFiles(family.build());<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>
+<span class="sourceLineNo">122</span>    @Override<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public void storeFile(final SnapshotRegionManifest.Builder region,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        final SnapshotRegionManifest.FamilyFiles.Builder family, final StoreFileInfo storeFile)<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.126"></a>
+<span class="sourceLineNo">127</span>            SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      sfManifest.setName(storeFile.getPath().getName());<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (storeFile.isReference()) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        sfManifest.setReference(storeFile.getReference().convert());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      sfManifest.setFileSize(storeFile.getReferencedFileStatus(rootFs).getLen());<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      family.addStoreFiles(sfManifest.build());<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">137</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      final Executor executor, final FileSystem fs, final Path snapshotDir,<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final SnapshotDescription desc, final int manifestSizeLimit) throws IOException {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    FileStatus[] manifestFiles = FSUtils.listStatus(fs, snapshotDir, new PathFilter() {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      @Override<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      public boolean accept(Path path) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        return path.getName().startsWith(SNAPSHOT_MANIFEST_PREFIX);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      }<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    });<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    if (manifestFiles == null || manifestFiles.length == 0) return null;<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    for (final FileStatus st: manifestFiles) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          FSDataInputStream stream = fs.open(st.getPath());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          CodedInputStream cin = CodedInputStream.newInstance(stream);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          cin.setSizeLimit(manifestSizeLimit);<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>          try {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>            return SnapshotRegionManifest.parseFrom(cin);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          } finally {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>            stream.close();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          }<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      });<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(manifestFiles.length);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    try {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      for (int i = 0; i &lt; manifestFiles.length; ++i) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        regionsManifest.add(completionService.take().get());<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      }<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    } catch (InterruptedException e) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throw new InterruptedIOException(e.getMessage());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    } catch (ExecutionException e) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      Throwable t = e.getCause();<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>      if(t instanceof InvalidProtocolBufferException) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        throw (InvalidProtocolBufferException)t;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      } else {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        IOException ex = new IOException("ExecutionException");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        ex.initCause(e.getCause());<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        throw ex;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    return regionsManifest;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    fs.delete(getRegionManifestPath(snapshotDir, manifest), true);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static Path getRegionManifestPath(final Path snapshotDir,<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      final SnapshotRegionManifest manifest) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    return new Path(snapshotDir, SNAPSHOT_MANIFEST_PREFIX + regionName);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 29c2124..b9f5c91 100644
--- a/downloads.html
+++ b/downloads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -395,7 +395,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 04873df..0a88ba5 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -331,7 +331,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 435143a..b0af1ee 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -411,7 +411,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 372a9ac..334f56f 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 88c1879..86c8d12 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 6917155..6f7ac1b 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -491,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index da5bb2b..34073f0 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 0338351..94eb0e5 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -440,7 +440,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 02f9e6a..4025a84 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 770e86b..76ddff4 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 07aadaf..47115a2 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 6cd8b81..372af96 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index e246bbb..b06e1d9 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 84c6115..ff247c3 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index cc15f2a..d4dd89c 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 488af61..30d0678 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -303,7 +303,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 5c21863..d52641c 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 086a676..a7b4a55 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 9721deb..d427b18 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 236e811..b473421 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 5668439..664bff5 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -754,7 +754,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index d327511..332776b 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1048,6 +1048,7 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.RegionPredicate.html" title="interface in org.apache.hadoop.hbase.snapshot" target="classFrame"><span class="interfaceName">TestExportSnapshot.RegionPredicate</span></a></li>
 <li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotHelpers.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestExportSnapshotHelpers</a></li>
 <li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestExportSnapshotNoCluster</a></li>
+<li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestExportSnapshotWithTemporaryDirectory</a></li>
 <li><a href="org/apache/hadoop/hbase/security/visibility/TestExpressionExpander.html" title="class in org.apache.hadoop.hbase.security.visibility" target="classFrame">TestExpressionExpander</a></li>
 <li><a href="org/apache/hadoop/hbase/security/visibility/TestExpressionParser.html" title="class in org.apache.hadoop.hbase.security.visibility" target="classFrame">TestExpressionParser</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestFailedAppendAndSync.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestFailedAppendAndSync</a></li>
@@ -2078,6 +2079,7 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.MasterSyncObserver.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotClientRetries.MasterSyncObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotCloneIndependence</a></li>
 <li><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotDescriptionUtils</a></li>
+<li><a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotDFSTemporaryDirectory</a></li>
 <li><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html" title="class in org.apache.hadoop.hbase.master.snapshot" target="classFrame">TestSnapshotFileCache</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotFromAdmin</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotFromClient</a></li>
@@ -2089,6 +2091,8 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotManifest</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotMetadata</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/TestSnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas" target="classFrame">TestSnapshotQuotaObserverChore</a></li>
+<li><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotTemporaryDirectory</a></li>
+<li><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotWithAcl</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotWithAcl.AccessReadAction</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotWithAcl.AccessWriteAction</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 21f1b42..56e7e59 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1048,6 +1048,7 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshot.RegionPredicate.html" title="interface in org.apache.hadoop.hbase.snapshot"><span class="interfaceName">TestExportSnapshot.RegionPredicate</span></a></li>
 <li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotHelpers.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotHelpers</a></li>
 <li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotNoCluster</a></li>
+<li><a href="org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a></li>
 <li><a href="org/apache/hadoop/hbase/security/visibility/TestExpressionExpander.html" title="class in org.apache.hadoop.hbase.security.visibility">TestExpressionExpander</a></li>
 <li><a href="org/apache/hadoop/hbase/security/visibility/TestExpressionParser.html" title="class in org.apache.hadoop.hbase.security.visibility">TestExpressionParser</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestFailedAppendAndSync.html" title="class in org.apache.hadoop.hbase.regionserver">TestFailedAppendAndSync</a></li>
@@ -2078,6 +2079,7 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.MasterSyncObserver.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotClientRetries.MasterSyncObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotCloneIndependence</a></li>
 <li><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotDescriptionUtils</a></li>
+<li><a href="org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a></li>
 <li><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html" title="class in org.apache.hadoop.hbase.master.snapshot">TestSnapshotFileCache</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromAdmin</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></li>
@@ -2089,6 +2091,8 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/TestSnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">TestSnapshotQuotaObserverChore</a></li>
+<li><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></li>
+<li><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessReadAction</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessWriteAction</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/constant-values.html b/testdevapidocs/constant-values.html
index 65023c8..ccebbfe 100644
--- a/testdevapidocs/constant-values.html
+++ b/testdevapidocs/constant-values.html
@@ -4246,6 +4246,32 @@
 </li>
 <li class="blockList">
 <table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
+<caption><span>org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th scope="col">Constant Field</th>
+<th class="colLast" scope="col">Value</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory.NUM_RS">
+<!--   -->
+</a><code>protected&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#NUM_RS">NUM_RS</a></code></td>
+<td class="colLast"><code>2</code></td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory.STRING_TABLE_NAME">
+<!--   -->
+</a><code>protected&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#STRING_TABLE_NAME">STRING_TABLE_NAME</a></code></td>
+<td class="colLast"><code>"test"</code></td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
 <caption><span>org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
@@ -11952,6 +11978,13 @@
 <td><code><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#COLUMN_2">COLUMN_2</a></code></td>
 <td class="colLast"><code>"b:2"</code></td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.rest.TestTableScan.COLUMN_EMPTY">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#COLUMN_EMPTY">COLUMN_EMPTY</a></code></td>
+<td class="colLast"><code>"a:"</code></td>
+</tr>
 </tbody>
 </table>
 </li>


[20/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index 7986a3a..90e736f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -1299,120 +1299,128 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncTableAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotTemporaryDirectory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestBlockEvictionFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncTableAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCIBadHostname.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCIBadHostname.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestBlockEvictionFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncTableAdminApi2.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableAdminApi2.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestCIBadHostname.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCIBadHostname.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncQuotaAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncQuotaAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncTableAdminApi2.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableAdminApi2.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncMetaRegionLocator.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocator.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncQuotaAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncQuotaAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncTableNoncedRetry.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncMetaRegionLocator.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocator.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestConnectionUtils.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestConnectionUtils.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncTableNoncedRetry.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncTableScanMetrics.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableScanMetrics.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestConnectionUtils.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestConnectionUtils.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestFromClientSideScanExcpetionWithCoprocessor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetionWithCoprocessor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncTableScanMetrics.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableScanMetrics.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncDecommissionAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncDecommissionAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestFromClientSideScanExcpetionWithCoprocessor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetionWithCoprocessor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMetaCache.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMetaCache.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncDecommissionAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncDecommissionAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestClientScannerRPCTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestClientScannerRPCTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMetaCache.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMetaCache.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncReplicationAdminApiWithClusters.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApiWithClusters.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestClientScannerRPCTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestClientScannerRPCTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCIPutOperationTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCIPutOperationTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncReplicationAdminApiWithClusters.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncReplicationAdminApiWithClusters.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncClusterAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncClusterAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestCIPutOperationTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCIPutOperationTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestScannersFromClientSide.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestScannersFromClientSide.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncClusterAdminApi.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncClusterAdminApi.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestHTableMultiplexer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestHTableMultiplexer.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestScannersFromClientSide.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestScannersFromClientSide.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMobSnapshotCloneIndependence.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMobSnapshotCloneIndependence.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestHTableMultiplexer.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestHTableMultiplexer.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncRegionLocatorTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncRegionLocatorTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMobSnapshotCloneIndependence.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMobSnapshotCloneIndependence.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestUpdateConfiguration.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestUpdateConfiguration.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncRegionLocatorTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncRegionLocatorTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAdmin1.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAdmin1.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestUpdateConfiguration.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestUpdateConfiguration.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCIIncrementRpcTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCIIncrementRpcTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAdmin1.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAdmin1.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCloneSnapshotFromClientWithRegionReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCloneSnapshotFromClientWithRegionReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestCIIncrementRpcTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCIIncrementRpcTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestIllegalTableDescriptor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestIllegalTableDescriptor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestCloneSnapshotFromClientWithRegionReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCloneSnapshotFromClientWithRegionReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestGetScanPartialResult.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestGetScanPartialResult.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestIllegalTableDescriptor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestIllegalTableDescriptor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestShortCircuitConnection.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestShortCircuitConnection.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestGetScanPartialResult.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestGetScanPartialResult.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestResultFromCoprocessor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestResultFromCoprocessor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestShortCircuitConnection.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestShortCircuitConnection.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestResultFromCoprocessor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestResultFromCoprocessor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestCIDeleteOperationTimeout.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestCIDeleteOperationTimeout.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotTemporaryDirectoryWithRegionReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestAsyncTableGetMultiThreadedWithEagerCompaction.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableGetMultiThreadedWithEagerCompaction.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
@@ -1519,126 +1527,130 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMetaWithReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMetaWithReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotDFSTemporaryDirectory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestClientOperationInterrupt.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestClientOperationInterrupt.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMetaWithReplicas.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMetaWithReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncTableAdminApi3.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableAdminApi3.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestClientOperationInterrupt.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestClientOperationInterrupt.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMultiParallel.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMultiParallel.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncTableAdminApi3.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableAdminApi3.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSplitOrMergeStatus.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMultiParallel.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMultiParallel.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncNonMetaRegionLocatorConcurrenyLimit.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSplitOrMergeStatus.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncAdminBuilder.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncAdminBuilder.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncNonMetaRegionLocatorConcurrenyLimit.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestIntraRowPagination.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestIntraRowPagination.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncAdminBuilder.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncAdminBuilder.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestHBaseAdminNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestIntraRowPagination.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestIntraRowPagination.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestBatchScanResultCache.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestBatchScanResultCache.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestHBaseAdminNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestHBaseAdminNoCluster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncBufferMutator.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncBufferMutator.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestBatchScanResultCache.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestBatchScanResultCache.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestTableSnapshotScanner.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncBufferMutator.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncBufferMutator.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestIncrementsFromClientSide.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestTableSnapshotScanner.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestResultSizeEstimation.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestResultSizeEstimation.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestIncrementsFromClientSide.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestIncrementsFromClientSide.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMultipleTimestamps.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMultipleTimestamps.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestResultSizeEstimation.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestResultSizeEstimation.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestFastFail.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestFastFail.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMultipleTimestamps.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMultipleTimestamps.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestResultScannerCursor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestResultScannerCursor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestFastFail.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestFastFail.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAvoidCellReferencesIntoShippedBlocks.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestResultScannerCursor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestResultScannerCursor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncResultScannerCursor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncResultScannerCursor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAvoidCellReferencesIntoShippedBlocks.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSnapshotMetadata.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncResultScannerCursor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncResultScannerCursor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncTableScannerCloseWhileSuspending.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableScannerCloseWhileSuspending.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotMetadata.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMultiRespectsLimits.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMultiRespectsLimits.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncTableScannerCloseWhileSuspending.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableScannerCloseWhileSuspending.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestClientPushback.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestClientPushback.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMultiRespectsLimits.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMultiRespectsLimits.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestClientPushback.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestClientPushback.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestShellNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestShellNoCluster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAdminShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAdminShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestShellNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestShellNoCluster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestQuotasShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestQuotasShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAdminShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAdminShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestReplicationShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestReplicationShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestQuotasShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestQuotasShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestTableShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestReplicationShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestReplicationShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestRpcControllerFactory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestRpcControllerFactory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestTableShell.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableShell.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestRpcControllerFactory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestRpcControllerFactory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestAsyncAggregationClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncAggregationClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
@@ -6069,18 +6081,22 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestExportSnapshotHelpers.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotHelpers.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestExportSnapshotWithTemporaryDirectory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestMobExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestExportSnapshotHelpers.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotHelpers.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMobExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMobSecureExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobSecureExportSnapshot.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
index a80758a..7ce8cc8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
@@ -911,38 +911,42 @@
 <td class="colLast"><span class="typeNameLabel">TestMvccConsistentScanner.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMvccConsistentScanner.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotTemporaryDirectory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#UTIL">UTIL</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestAsyncTableScanMetrics.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncTableScanMetrics.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestShortCircuitConnection.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestShortCircuitConnection.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestMultiParallel.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestMultiParallel.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestTableSnapshotScanner.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestSnapshotMetadata.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestClientPushback.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestClientPushback.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestRpcControllerFactory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestRpcControllerFactory.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestAsyncAggregationClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAsyncAggregationClient.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestServerLoadDurability.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestServerLoadDurability.html#utility">utility</a></span></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html
index 3376acb..ddd6b02 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSmallReversedScanner.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" target="_top">Frames</a></li>
@@ -945,7 +945,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSmallReversedScanner.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html
new file mode 100644
index 0000000..7f9a1e1
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html
@@ -0,0 +1,357 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestSnapshotDFSTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestSnapshotDFSTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":9,"i1":9};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestSnapshotDFSTemporaryDirectory.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotDFSTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.client</div>
+<h2 title="Class TestSnapshotDFSTemporaryDirectory" class="title">Class TestSnapshotDFSTemporaryDirectory</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#line.41">TestSnapshotDFSTemporaryDirectory</a>
+extends <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></pre>
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on the same file system as the root directory
+ <p>
+ This is an end-to-end test for the snapshot utility</div>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#admin">admin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#manifestVersion">manifestVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#NUM_RS">NUM_RS</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#STRING_TABLE_NAME">STRING_TABLE_NAME</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TABLE_NAME">TABLE_NAME</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEMP_DIR">TEMP_DIR</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEST_FAM">TEST_FAM</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#UTIL">UTIL</a></code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#TestSnapshotDFSTemporaryDirectory--">TestSnapshotDFSTemporaryDirectory</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</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="t1" class="tableTab"><span><a href="javascript:show(1);">Static 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>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#setupCluster--">setupCluster</a></span>()</code>
+<div class="block">Setup the config for the cluster</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>private static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#cleanupTest--">cleanupTest</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#data--">data</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#getNumReplicas--">getNumReplicas</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setup--">setup</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#tearDown--">tearDown</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testEnsureTemporaryDirectoryTransfer--">testEnsureTemporaryDirectoryTransfer</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testOfflineTableSnapshot--">testOfflineTableSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDire
 ctory.html#testOfflineTableSnapshotWithEmptyRegion--">testOfflineTableSnapshotWithEmptyRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreDisabledSnapshot--">testRestoreDisabledSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreEnabledSnapshot--">testRestoreEnabledSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testSnapshotCloneContents--">testSnapshotCloneContents</a></code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <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>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>CLASS_RULE</h4>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#line.45">CLASS_RULE</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestSnapshotDFSTemporaryDirectory--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestSnapshotDFSTemporaryDirectory</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#line.41">TestSnapshotDFSTemporaryDirectory</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="setupCluster--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setupCluster</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#line.53">setupCluster</a>()
+                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<div class="block">Setup the config for the cluster</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code> - on failure</dd>
+</dl>
+</li>
+</ul>
+<a name="setupConf-org.apache.hadoop.conf.Configuration-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>setupConf</h4>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html#line.59">setupConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestSnapshotDFSTemporaryDirectory.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotDFSTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html
index dfd71ed..43f79c8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -357,7 +357,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotMetadata.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotMetadata.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotMetadata.html
index 148842d..3d2e131 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotMetadata.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotMetadata.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromClientWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" target="_top">Frames</a></li>
@@ -845,7 +845,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromClientWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" target="_top">Frames</a></li>


[45/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index cfa9873..a54afb5 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,8 +25,8 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3735,
-             Errors: 15232,
+      <title>File: 3739,
+             Errors: 15225,
              Warnings: 0,
              Infos: 0
       </title>
@@ -15623,7 +15623,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  2
+                  1
                 </td>
               </tr>
                           <tr>
@@ -27892,6 +27892,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectoryWithRegionReplicas.java">org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.client.MasterCoprocessorRpcChannelImpl.java">org/apache/hadoop/hbase/client/MasterCoprocessorRpcChannelImpl.java</a>
                 </td>
                 <td>
@@ -31191,7 +31205,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  18
+                  12
                 </td>
               </tr>
                           <tr>
@@ -36754,6 +36768,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory.java">org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.regionserver.TestGetClosestAtOrBefore.java">org/apache/hadoop/hbase/regionserver/TestGetClosestAtOrBefore.java</a>
                 </td>
                 <td>
@@ -40492,6 +40520,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory.java">org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.TestClientClusterMetrics.java">org/apache/hadoop/hbase/TestClientClusterMetrics.java</a>
                 </td>
                 <td>
@@ -46162,6 +46204,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory.java">org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.client.IsolationLevel.java">org/apache/hadoop/hbase/client/IsolationLevel.java</a>
                 </td>
                 <td>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 530252d..57d0669 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 305927d..b771aae 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -879,7 +879,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index e3e00c6..9b10c65 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -313,7 +313,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index b48f85c..07b5bdf 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180911" />
+    <meta name="Date-Revision-yyyymmdd" content="20180912" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -1005,7 +1005,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-09-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-09-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index a713a5b..3541ab6 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3824,21 +3824,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Tue Sep 11 14:45:27 UTC 2018"</code></td>
+<td class="colLast"><code>"Wed Sep 12 14:44:52 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"2ab8122a24eb8444c2804b7f980bf008f395933d"</code></td>
+<td class="colLast"><code>"3810ba2c6edfc531181ffc9e6c68396a0c2d2027"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"15a756b17eed0c34f46a577d4852d9ca"</code></td>
+<td class="colLast"><code>"18f0f49c83fb2fc12ae90317ce7e2e9f"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -26149,6 +26149,13 @@
 <td class="colLast"><code>".tmp"</code></td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_WORKING_DIR">SNAPSHOT_WORKING_DIR</a></code></td>
+<td class="colLast"><code>"hbase.snapshot.working.dir"</code></td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOTINFO_FILE">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index cc36e63..95f0085 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -15724,9 +15724,9 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/CompleteScanResultCache.html#CompleteScanResultCache--">CompleteScanResultCache()</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/CompleteScanResultCache.html" title="class in org.apache.hadoop.hbase.client">CompleteScanResultCache</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">completeSnapshot(Path, Path, FileSystem)</a></span> - Method in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.FileSystem-">completeSnapshot(Path, Path, FileSystem, FileSystem)</a></span> - Method in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></dt>
 <dd>
-<div class="block">Reset the manager to allow another snapshot to proceed</div>
+<div class="block">Reset the manager to allow another snapshot to proceed.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#completeSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">completeSnapshot(SnapshotProtos.SnapshotDescription, Path, Path, FileSystem)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
 <dd>
@@ -33384,12 +33384,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.master.replication.<a href="org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.html" title="class in org.apache.hadoop.hbase.master.replication">SyncReplicationReplayWALManager</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html" title="class in org.apache.hadoop.hbase.master.snapshot">MasterSnapshotVerifier</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotFileCache</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mob/compactions/MobCompactor.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.mob.compactions.<a href="org/apache/hadoop/hbase/mob/compactions/MobCompactor.html" title="class in org.apache.hadoop.hbase.mob.compactions">MobCompactor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a></dt>
@@ -33448,12 +33444,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotInfo.SnapshotStats</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifestV1.ManifestBuilder</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifestV2.ManifestBuilder</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/FSRegionScanner.html#fs">fs</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/FSRegionScanner.html" title="class in org.apache.hadoop.hbase.util">FSRegionScanner</a></dt>
 <dd>
 <div class="block">The file system used</div>
@@ -37101,10 +37091,6 @@
 <dd>
 <div class="block">Get the directory for a completed snapshot.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getCompletedSnapshotDir-org.apache.hadoop.fs.Path-java.lang.String-">getCompletedSnapshotDir(Path, String)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
-<dd>
-<div class="block">Get the directory to store the snapshot instance</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.html#getCompletedSnapshots-java.util.regex.Pattern-">getCompletedSnapshots(Pattern)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.html" title="class in org.apache.hadoop.hbase.client">RawAsyncHBaseAdmin</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.html#getCompletedSnapshots-java.util.regex.Pattern-java.util.regex.Pattern-">getCompletedSnapshots(Pattern, Pattern)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.html" title="class in org.apache.hadoop.hbase.client">RawAsyncHBaseAdmin</a></dt>
@@ -38372,6 +38358,11 @@
 &nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/ColumnFamilyDescriptorBuilder.html#getDefaultValuesBytes--">getDefaultValuesBytes()</a></span> - Static method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/ColumnFamilyDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">ColumnFamilyDescriptorBuilder</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getDefaultWorkingSnapshotDir-org.apache.hadoop.fs.Path-">getDefaultWorkingSnapshotDir(Path)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dd>
+<div class="block">Get the default working directory for snapshots - where they are built, where they are
+ temporarily copied on export, etc.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/metrics/MetricRegistriesLoader.html#getDefinedImplemantations--">getDefinedImplemantations()</a></span> - Static method in class org.apache.hadoop.hbase.metrics.<a href="org/apache/hadoop/hbase/metrics/MetricRegistriesLoader.html" title="class in org.apache.hadoop.hbase.metrics">MetricRegistriesLoader</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/JitterScheduledThreadPoolExecutorImpl.JitteredRunnableScheduledFuture.html#getDelay-java.util.concurrent.TimeUnit-">getDelay(TimeUnit)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/JitterScheduledThreadPoolExecutorImpl.JitteredRunnableScheduledFuture.html" title="class in org.apache.hadoop.hbase">JitterScheduledThreadPoolExecutorImpl.JitteredRunnableScheduledFuture</a></dt>
@@ -50307,6 +50298,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/RSRpcServices.html#getSpaceQuotaSnapshots-org.apache.hbase.thirdparty.com.google.protobuf.RpcController-org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.GetSpaceQuotaSnapshotsRequest-">getSpaceQuotaSnapshots(RpcController, QuotaProtos.GetSpaceQuotaSnapshotsRequest)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getSpecifiedSnapshotDir-org.apache.hadoop.fs.Path-java.lang.String-">getSpecifiedSnapshotDir(Path, String)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dd>
+<div class="block">Get the directory within the given filepath to store the snapshot instance</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.html#getSplitAlgo-org.apache.hadoop.conf.Configuration-">getSplitAlgo(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSnapshotInputFormatImpl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/StripeStoreConfig.html#getSplitCount--">getSplitCount()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/StripeStoreConfig.html" title="class in org.apache.hadoop.hbase.regionserver">StripeStoreConfig</a></dt>
@@ -54203,6 +54198,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALProvider.html#getWAL-org.apache.hadoop.hbase.client.RegionInfo-">getWAL(RegionInfo)</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#getWalArchiveDir--">getWalArchiveDir()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html#getWALArchiveDirectoryName-org.apache.hadoop.conf.Configuration-java.lang.String-">getWALArchiveDirectoryName(Configuration, String)</a></span> - Static method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html" title="class in org.apache.hadoop.hbase.wal">AbstractFSWALProvider</a></dt>
 <dd>
 <div class="block">Construct the directory name for all old WALs on a given server.</div>
@@ -54386,16 +54383,16 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getWorkerThreadCount--">getWorkerThreadCount()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.fs.Path-">getWorkingSnapshotDir(Path)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">getWorkingSnapshotDir(Path, Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
 <dd>
 <div class="block">Get the general working directory for snapshots - where they are built, where they are
  temporarily copied on export, etc.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">getWorkingSnapshotDir(SnapshotProtos.SnapshotDescription, Path)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">getWorkingSnapshotDir(SnapshotProtos.SnapshotDescription, Path, Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
 <dd>
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-java.lang.String-org.apache.hadoop.fs.Path-">getWorkingSnapshotDir(String, Path)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-java.lang.String-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">getWorkingSnapshotDir(String, Path, Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
 <dd>
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 </dd>
@@ -65039,6 +65036,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/RegionStateNode.html#isStuck--">isStuck()</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/RegionStateNode.html" title="class in org.apache.hadoop.hbase.master.assignment">RegionStateNode</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#isSubDirectoryOf-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">isSubDirectoryOf(Path, Path)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dd>
+<div class="block">Determines if the given workingDir is a subdirectory of the given "root directory"</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/Procedure.html#isSuccess--">isSuccess()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RegionMover.html#isSuccessfulScan-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.client.RegionInfo-">isSuccessfulScan(Admin, RegionInfo)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RegionMover.html" title="class in org.apache.hadoop.hbase.util">RegionMover</a></dt>
@@ -65369,6 +65370,10 @@
 <dd>
 <div class="block">Check if WAL file is eligible for deletion Future: to support all backup destinations</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#isWithinDefaultWorkingDir-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">isWithinDefaultWorkingDir(Path, Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dd>
+<div class="block">Determines if the given workingDir is a subdirectory of the default working snapshot directory</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/provider/producer/PlainTextMessageBodyProducer.html#isWriteable-java.lang.Class-java.lang.reflect.Type-java.lang.annotation.Annotation:A-javax.ws.rs.core.MediaType-">isWriteable(Class&lt;?&gt;, Type, Annotation[], MediaType)</a></span> - Method in class org.apache.hadoop.hbase.rest.provider.producer.<a href="org/apache/hadoop/hbase/rest/provider/producer/PlainTextMessageBodyProducer.html" title="class in org.apache.hadoop.hbase.rest.provider.producer">PlainTextMessageBodyProducer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/provider/producer/ProtobufMessageBodyProducer.html#isWriteable-java.lang.Class-java.lang.reflect.Type-java.lang.annotation.Annotation:A-javax.ws.rs.core.MediaType-">isWriteable(Class&lt;?&gt;, Type, Annotation[], MediaType)</a></span> - Method in class org.apache.hadoop.hbase.rest.provider.producer.<a href="org/apache/hadoop/hbase/rest/provider/producer/ProtobufMessageBodyProducer.html" title="class in org.apache.hadoop.hbase.rest.provider.producer">ProtobufMessageBodyProducer</a></dt>
@@ -72059,7 +72064,7 @@
 <dd>
 <div class="block">General snapshot verification on the master.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">MasterSnapshotVerifier(MasterServices, SnapshotProtos.SnapshotDescription, Path)</a></span> - Constructor for class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html" title="class in org.apache.hadoop.hbase.master.snapshot">MasterSnapshotVerifier</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.FileSystem-">MasterSnapshotVerifier(MasterServices, SnapshotProtos.SnapshotDescription, FileSystem)</a></span> - Constructor for class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html" title="class in org.apache.hadoop.hbase.master.snapshot">MasterSnapshotVerifier</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MetricsMaster.html#masterSource">masterSource</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a></dt>
 <dd>&nbsp;</dd>
@@ -96301,8 +96306,6 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/MasterWalManager.html#rootDir">rootDir</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#rootDir">rootDir</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html" title="class in org.apache.hadoop.hbase.master.snapshot">MasterSnapshotVerifier</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#rootDir">rootDir</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootDir">rootDir</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></dt>
@@ -96315,6 +96318,14 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/FSTableDescriptors.html#rootdir">rootdir</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/FSTableDescriptors.html" title="class in org.apache.hadoop.hbase.util">FSTableDescriptors</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootFs">rootFs</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#rootFs">rootFs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#rootFs">rootFs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifestV1.ManifestBuilder</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html#rootFs">rootFs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifestV2.ManifestBuilder</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.WalProcedureMap.html#rootHead">rootHead</a></span> - Variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.WalProcedureMap.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFormatReader.WalProcedureMap</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/CacheStats.html#rootIndexHitCount">rootIndexHitCount</a></span> - Variable in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></dt>
@@ -107633,6 +107644,11 @@ service.</div>
 <div class="block">Conf key for # of ms elapsed between checks for snapshot errors while waiting for
  completion.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_WORKING_DIR">SNAPSHOT_WORKING_DIR</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDescriptionUtils</a></dt>
+<dd>
+<div class="block">The configuration property that determines the filepath of the snapshot
+ base working directory</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/metrics/impl/HBaseMetrics2HadoopMetricsAdapter.html#snapshotAllMetrics-org.apache.hadoop.hbase.metrics.MetricRegistry-org.apache.hadoop.metrics2.MetricsCollector-">snapshotAllMetrics(MetricRegistry, MetricsCollector)</a></span> - Method in class org.apache.hadoop.hbase.metrics.impl.<a href="org/apache/hadoop/hbase/metrics/impl/HBaseMetrics2HadoopMetricsAdapter.html" title="class in org.apache.hadoop.hbase.metrics.impl">HBaseMetrics2HadoopMetricsAdapter</a></dt>
 <dd>
 <div class="block">Iterates over the MetricRegistry and adds them to the <code>collector</code>.</div>
@@ -123376,6 +123392,14 @@ the order they are declared.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#workingDir">workingDir</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#workingDirFs">workingDirFs</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html" title="class in org.apache.hadoop.hbase.master.snapshot">MasterSnapshotVerifier</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDirFs">workingDirFs</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#workingDirFs">workingDirFs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html#workingDirFs">workingDirFs</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifestV1.ManifestBuilder</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/HBaseFsck.WorkItemHdfsDir.html#WorkItemHdfsDir-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.hbase.util.HBaseFsck.ErrorReporter-org.apache.hadoop.fs.FileStatus-">WorkItemHdfsDir(FileSystem, HBaseFsck.ErrorReporter, FileStatus)</a></span> - Constructor for class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/HBaseFsck.WorkItemHdfsDir.html" title="class in org.apache.hadoop.hbase.util">HBaseFsck.WorkItemHdfsDir</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/HBaseFsck.WorkItemHdfsRegionInfo.html#WorkItemHdfsRegionInfo-org.apache.hadoop.hbase.util.HBaseFsck.HbckInfo-org.apache.hadoop.hbase.util.HBaseFsck-org.apache.hadoop.hbase.util.HBaseFsck.ErrorReporter-">WorkItemHdfsRegionInfo(HBaseFsck.HbckInfo, HBaseFsck, HBaseFsck.ErrorReporter)</a></span> - Constructor for class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/HBaseFsck.WorkItemHdfsRegionInfo.html" title="class in org.apache.hadoop.hbase.util">HBaseFsck.WorkItemHdfsRegionInfo</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index ee3d758..f55f5e6 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 69bbd77..e05f251 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -555,24 +555,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/errorhandling/class-use/ForeignExceptionSnare.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/errorhandling/class-use/ForeignExceptionSnare.html b/devapidocs/org/apache/hadoop/hbase/errorhandling/class-use/ForeignExceptionSnare.html
index e92289b..3933d8e 100644
--- a/devapidocs/org/apache/hadoop/hbase/errorhandling/class-use/ForeignExceptionSnare.html
+++ b/devapidocs/org/apache/hadoop/hbase/errorhandling/class-use/ForeignExceptionSnare.html
@@ -263,7 +263,7 @@
 <tbody>
 <tr class="altColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#SnapshotManifest-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.errorhandling.ForeignExceptionSnare-">SnapshotManifest</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
-                org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                org.apache.hadoop.fs.FileSystem&nbsp;rootFs,
                 org.apache.hadoop.fs.Path&nbsp;workingDir,
                 org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;desc,
                 <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;monitor)</code>&nbsp;</td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index ae0124e..ce950b0 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index ba00bfe..9fd492a 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index b2f6636..bfe2507 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -275,11 +275,11 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 7557e4f..df0adf0 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,9 +353,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 6ec2fb5..0678f9b 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,10 +293,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html b/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
index 4bf1637..1f64707 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
@@ -825,9 +825,9 @@
                            <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;manager)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">MasterSnapshotVerifier</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html#MasterSnapshotVerifier-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.FileSystem-">MasterSnapshotVerifier</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;services,
                       org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
-                      org.apache.hadoop.fs.Path&nbsp;rootDir)</code>&nbsp;</td>
+                      org.apache.hadoop.fs.FileSystem&nbsp;workingDirFs)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#SnapshotManager-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.master.MetricsMaster-org.apache.hadoop.hbase.procedure.ProcedureCoordinator-org.apache.hadoop.hbase.executor.ExecutorService-">SnapshotManager</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index c8f53a7..e61e3ae 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -348,10 +348,10 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index c14674a..a189946 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -218,8 +218,8 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 </ul>
 </li>
 </ul>


[19/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html
new file mode 100644
index 0000000..e57e988
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html
@@ -0,0 +1,679 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestSnapshotTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestSnapshotTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":9,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestSnapshotTemporaryDirectory.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.client</div>
+<h2 title="Class TestSnapshotTemporaryDirectory" class="title">Class TestSnapshotTemporaryDirectory</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>Direct Known Subclasses:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></dd>
+</dl>
+<hr>
+<br>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.74">TestSnapshotTemporaryDirectory</a>
+extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on a different file system than the root directory
+ <p>
+ This is an end-to-end test for the snapshot utility</div>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected static org.apache.hadoop.hbase.client.Admin</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#admin">admin</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static org.slf4j.Logger</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#LOG">LOG</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#manifestVersion">manifestVersion</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected static int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#NUM_RS">NUM_RS</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#STRING_TABLE_NAME">STRING_TABLE_NAME</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected static org.apache.hadoop.hbase.TableName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TABLE_NAME">TABLE_NAME</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEMP_DIR">TEMP_DIR</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEST_FAM">TEST_FAM</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#UTIL">UTIL</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TestSnapshotTemporaryDirectory--">TestSnapshotTemporaryDirectory</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</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="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></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>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#cleanupTest--">cleanupTest</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#data--">data</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>protected int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#getNumReplicas--">getNumReplicas</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setup--">setup</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setupCluster--">setupCluster</a></span>()</code>
+<div class="block">Setup the config for the cluster</div>
+</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>private static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#takeSnapshot-org.apache.hadoop.hbase.TableName-java.lang.String-boolean-">takeSnapshot</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+            <a href="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,
+            boolean&nbsp;disabled)</code>&nbsp;</td>
+</tr>
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#tearDown--">tearDown</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i8" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testEnsureTemporaryDirectoryTransfer--">testEnsureTemporaryDirectoryTransfer</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i9" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testOfflineTableSnapshot--">testOfflineTableSnapshot</a></span>()</code>
+<div class="block">Test snapshotting a table that is offline</div>
+</td>
+</tr>
+<tr id="i10" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testOfflineTableSnapshotWithEmptyRegion--">testOfflineTableSnapshotWithEmptyRegion</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreDisabledSnapshot--">testRestoreDisabledSnapshot</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i12" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreEnabledSnapshot--">testRestoreEnabledSnapshot</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i13" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testSnapshotCloneContents--">testSnapshotCloneContents</a></span>()</code>
+<div class="block">Tests that snapshot has correct contents by taking snapshot, cloning it, then affirming
+ the contents of the original and cloned table match</div>
+</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <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>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CLASS_RULE</h4>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.76">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="manifestVersion">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>manifestVersion</h4>
+<pre>public&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.84">manifestVersion</a></pre>
+</li>
+</ul>
+<a name="LOG">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>LOG</h4>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.86">LOG</a></pre>
+</li>
+</ul>
+<a name="NUM_RS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>NUM_RS</h4>
+<pre>protected static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.87">NUM_RS</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory.NUM_RS">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="TEMP_DIR">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TEMP_DIR</h4>
+<pre>protected static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.88">TEMP_DIR</a></pre>
+</li>
+</ul>
+<a name="admin">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>admin</h4>
+<pre>protected static&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.91">admin</a></pre>
+</li>
+</ul>
+<a name="UTIL">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>UTIL</h4>
+<pre>protected static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.92">UTIL</a></pre>
+</li>
+</ul>
+<a name="STRING_TABLE_NAME">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>STRING_TABLE_NAME</h4>
+<pre>protected 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/client/TestSnapshotTemporaryDirectory.html#line.93">STRING_TABLE_NAME</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory.STRING_TABLE_NAME">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="TEST_FAM">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TEST_FAM</h4>
+<pre>protected static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.94">TEST_FAM</a></pre>
+</li>
+</ul>
+<a name="TABLE_NAME">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TABLE_NAME</h4>
+<pre>protected static final&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.95">TABLE_NAME</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestSnapshotTemporaryDirectory--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestSnapshotTemporaryDirectory</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.74">TestSnapshotTemporaryDirectory</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="data--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>data</h4>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.79">data</a>()</pre>
+</li>
+</ul>
+<a name="setupCluster--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setupCluster</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.102">setupCluster</a>()
+                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<div class="block">Setup the config for the cluster</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code> - on failure</dd>
+</dl>
+</li>
+</ul>
+<a name="setupConf-org.apache.hadoop.conf.Configuration-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setupConf</h4>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.108">setupConf</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+</li>
+</ul>
+<a name="setup--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setup</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.126">setup</a>()
+           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="getNumReplicas--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getNumReplicas</h4>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.132">getNumReplicas</a>()</pre>
+</li>
+</ul>
+<a name="tearDown--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDown</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.136">tearDown</a>()
+              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="cleanupTest--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>cleanupTest</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.142">cleanupTest</a>()</pre>
+</li>
+</ul>
+<a name="testRestoreDisabledSnapshot--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testRestoreDisabledSnapshot</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.151">testRestoreDisabledSnapshot</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>,
+                                        <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>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testRestoreEnabledSnapshot--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testRestoreEnabledSnapshot</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.217">testRestoreEnabledSnapshot</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>,
+                                       <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>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testOfflineTableSnapshot--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testOfflineTableSnapshot</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.284">testOfflineTableSnapshot</a>()
+                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<div class="block">Test snapshotting a table that is offline</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code> - if snapshot does not complete successfully</dd>
+</dl>
+</li>
+</ul>
+<a name="testSnapshotCloneContents--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSnapshotCloneContents</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.338">testSnapshotCloneContents</a>()
+                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<div class="block">Tests that snapshot has correct contents by taking snapshot, cloning it, then affirming
+ the contents of the original and cloned table match</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code> - if snapshot does not complete successfully</dd>
+</dl>
+</li>
+</ul>
+<a name="testOfflineTableSnapshotWithEmptyRegion--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testOfflineTableSnapshotWithEmptyRegion</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.374">testOfflineTableSnapshotWithEmptyRegion</a>()
+                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testEnsureTemporaryDirectoryTransfer--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testEnsureTemporaryDirectoryTransfer</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.419">testEnsureTemporaryDirectoryTransfer</a>()
+                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="takeSnapshot-org.apache.hadoop.hbase.TableName-java.lang.String-boolean-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>takeSnapshot</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#line.463">takeSnapshot</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+                          <a href="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,
+                          boolean&nbsp;disabled)
+                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestSnapshotTemporaryDirectory.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
new file mode 100644
index 0000000..e599e84
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
@@ -0,0 +1,331 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestSnapshotTemporaryDirectoryWithRegionReplicas (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestSnapshotTemporaryDirectoryWithRegionReplicas (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.client</div>
+<h2 title="Class TestSnapshotTemporaryDirectoryWithRegionReplicas" class="title">Class TestSnapshotTemporaryDirectoryWithRegionReplicas</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectoryWithRegionReplicas</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#line.26">TestSnapshotTemporaryDirectoryWithRegionReplicas</a>
+extends <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#admin">admin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#manifestVersion">manifestVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#NUM_RS">NUM_RS</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#STRING_TABLE_NAME">STRING_TABLE_NAME</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TABLE_NAME">TABLE_NAME</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEMP_DIR">TEMP_DIR</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#TEST_FAM">TEST_FAM</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#UTIL">UTIL</a></code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#TestSnapshotTemporaryDirectoryWithRegionReplicas--">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</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></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>protected int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#getNumReplicas--">getNumReplicas</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#cleanupTest--">cleanupTest</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#data--">data</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setup--">setup</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#setupCluster--">setupCluster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#tearDown--">tearDown</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testEnsureTemporaryDirectoryTransfer--">testEnsureTemporaryDirectoryTransfer</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testOfflineTableSnapshot--">testOfflineTableSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirector
 y.html#testOfflineTableSnapshotWithEmptyRegion--">testOfflineTableSnapshotWithEmptyRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreDisabledSnapshot--">testRestoreDisabledSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testRestoreEnabledSnapshot--">testRestoreEnabledSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#testSnapshotCloneContents--">testSnapshotCloneContents</a></code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <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>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>CLASS_RULE</h4>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#line.30">CLASS_RULE</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestSnapshotTemporaryDirectoryWithRegionReplicas--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestSnapshotTemporaryDirectoryWithRegionReplicas</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#line.26">TestSnapshotTemporaryDirectoryWithRegionReplicas</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="getNumReplicas--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getNumReplicas</h4>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html#line.34">getNumReplicas</a>()</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html#getNumReplicas--">getNumReplicas</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html
index 5bc66f1..49cebcf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -559,7 +559,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/security/access/SecureTe
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotDFSTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotDFSTemporaryDirectory.html b/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotDFSTemporaryDirectory.html
new file mode 100644
index 0000000..92edc94
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotDFSTemporaryDirectory.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/client/class-use/TestSnapshotDFSTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotDFSTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory" class="title">Uses of Class<br>org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.client.TestSnapshotDFSTemporaryDirectory</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/client/class-use/TestSnapshotDFSTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotDFSTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectory.html b/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectory.html
new file mode 100644
index 0000000..afe2d53
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectory.html
@@ -0,0 +1,172 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory" class="title">Uses of Class<br>org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectory</h2>
+</div>
+<div class="classUseContainer">
+<ul class="blockList">
+<li class="blockList">
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing packages, and an explanation">
+<caption><span>Packages that use <a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Package</th>
+<th class="colLast" scope="col">Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.client">org.apache.hadoop.hbase.client</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<ul class="blockList">
+<li class="blockList"><a name="org.apache.hadoop.hbase.client">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a> in <a href="../../../../../../org/apache/hadoop/hbase/client/package-summary.html">org.apache.hadoop.hbase.client</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing subclasses, and an explanation">
+<caption><span>Subclasses of <a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a> in <a href="../../../../../../org/apache/hadoop/hbase/client/package-summary.html">org.apache.hadoop.hbase.client</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Class and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a></span></code>
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on the same file system as the root directory</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></span></code>&nbsp;</td>
+</tr>
+</tbody>
+</table>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectory.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectory.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html b/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
new file mode 100644
index 0000000..76ab1f5
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectoryWithRegionReplicas (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectoryWithRegionReplicas (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectoryWithRegionReplicas" class="title">Uses of Class<br>org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectoryWithRegionReplicas</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.client.TestSnapshotTemporaryDirectoryWithRegionReplicas</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/client/class-use/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotTemporaryDirectoryWithRegionReplicas.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/client/package-frame.html
index 99a9151..027376c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/package-frame.html
@@ -269,10 +269,13 @@
 <li><a href="TestSizeFailures.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSizeFailures</a></li>
 <li><a href="TestSmallReversedScanner.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSmallReversedScanner</a></li>
 <li><a href="TestSnapshotCloneIndependence.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotCloneIndependence</a></li>
+<li><a href="TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotDFSTemporaryDirectory</a></li>
 <li><a href="TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotFromAdmin</a></li>
 <li><a href="TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotFromClient</a></li>
 <li><a href="TestSnapshotFromClientWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotFromClientWithRegionReplicas</a></li>
 <li><a href="TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotMetadata</a></li>
+<li><a href="TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotTemporaryDirectory</a></li>
+<li><a href="TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></li>
 <li><a href="TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotWithAcl</a></li>
 <li><a href="TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotWithAcl.AccessReadAction</a></li>
 <li><a href="TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestSnapshotWithAcl.AccessWriteAction</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/client/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/client/package-summary.html
index ccfe07f..ef2c9e4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/package-summary.html
@@ -1296,76 +1296,94 @@
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotDFSTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotDFSTemporaryDirectory</a></td>
+<td class="colLast">
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on the same file system as the root directory</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromAdmin.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromAdmin</a></td>
 <td class="colLast">
 <div class="block">Test snapshot logic from the client</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClient</a></td>
 <td class="colLast">
 <div class="block">Test create/using/deleting snapshots from the client</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotFromClientWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotFromClientWithRegionReplicas</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></td>
 <td class="colLast">
 <div class="block">Test class to verify that metadata is consistent before and after a snapshot attempt.</div>
 </td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectory</a></td>
+<td class="colLast">
+<div class="block">This class tests that the use of a temporary snapshot directory supports snapshot functionality
+ while the temporary directory is on a different file system than the root directory</div>
+</td>
+</tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotTemporaryDirectoryWithRegionReplicas</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessReadAction</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessWriteAction</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessReadAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessReadAction</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.html" title="class in org.apache.hadoop.hbase.client">TestSplitOrMergeStatus</a></td>
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSnapshotWithAcl.AccessWriteAction.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotWithAcl.AccessWriteAction</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.html" title="class in org.apache.hadoop.hbase.client">TestSplitOrMergeStatus</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TestTableDescriptorBuilder</a></td>
 <td class="colLast">
 <div class="block">Test setting values in the descriptor</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableDescriptorUtils.html" title="class in org.apache.hadoop.hbase.client">TestTableDescriptorUtils</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableFavoredNodes.html" title="class in org.apache.hadoop.hbase.client">TestTableFavoredNodes</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableShell.html" title="class in org.apache.hadoop.hbase.client">TestTableShell</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestTableSnapshotScanner.html" title="class in org.apache.hadoop.hbase.client">TestTableSnapshotScanner</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestTimestampsFilter.html" title="class in org.apache.hadoop.hbase.client">TestTimestampsFilter</a></td>
 <td class="colLast">
 <div class="block">Run tests related to <code>TimestampsFilter</code> using HBase client APIs.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestUpdateConfiguration.html" title="class in org.apache.hadoop.hbase.client">TestUpdateConfiguration</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/client/TestZKAsyncRegistry.html" title="class in org.apache.hadoop.hbase.client">TestZKAsyncRegistry</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>


[17/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
index 96212ea..b933a5a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.86">TestAtomicOperation</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.87">TestAtomicOperation</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Testing of HRegion.incrementColumnValue, HRegion.increment,
  and HRegion.append</div>
@@ -310,32 +310,36 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i7" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testAppendWithNonExistingFamily--">testAppendWithNonExistingFamily</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testAppendWithMultipleFamilies--">testAppendWithMultipleFamilies</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testAppendWithNonExistingFamily--">testAppendWithNonExistingFamily</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i9" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testIncrementMultiThreads--">testIncrementMultiThreads</a></span>()</code>
 <div class="block">Test multi-threaded increments.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testIncrementWithNonExistingFamily--">testIncrementWithNonExistingFamily</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testMultiRowMutationMultiThreads--">testMultiRowMutationMultiThreads</a></span>()</code>
 <div class="block">Test multi-threaded region mutations.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testPutAndCheckAndPutInParallel--">testPutAndCheckAndPutInParallel</a></span>()</code>
 <div class="block">Test written as a verifier for HBASE-7051, CheckAndPut should properly read
  MVCC.</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#testRowMutationMultiThreads--">testRowMutationMultiThreads</a></span>()</code>
 <div class="block">Test multi-threaded row mutations.</div>
@@ -369,7 +373,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.89">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.90">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -378,7 +382,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.92">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.93">LOG</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -387,7 +391,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.93">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.94">name</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -396,7 +400,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.95">region</a></pre>
+<pre>org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.96">region</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -405,7 +409,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.96">TEST_UTIL</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.97">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -414,7 +418,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.99">tableName</a></pre>
+<pre>static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.100">tableName</a></pre>
 </li>
 </ul>
 <a name="qual1">
@@ -423,7 +427,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>qual1</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.100">qual1</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.101">qual1</a></pre>
 </li>
 </ul>
 <a name="qual2">
@@ -432,7 +436,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>qual2</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.101">qual2</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.102">qual2</a></pre>
 </li>
 </ul>
 <a name="qual3">
@@ -441,7 +445,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>qual3</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.102">qual3</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.103">qual3</a></pre>
 </li>
 </ul>
 <a name="value1">
@@ -450,7 +454,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>value1</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.103">value1</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.104">value1</a></pre>
 </li>
 </ul>
 <a name="value2">
@@ -459,7 +463,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>value2</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.104">value2</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.105">value2</a></pre>
 </li>
 </ul>
 <a name="row">
@@ -468,7 +472,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>row</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.105">row</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.106">row</a></pre>
 </li>
 </ul>
 <a name="row2">
@@ -477,7 +481,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>row2</h4>
-<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.106">row2</a></pre>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.107">row2</a></pre>
 </li>
 </ul>
 <a name="latch">
@@ -486,7 +490,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>latch</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.580">latch</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.619">latch</a></pre>
 </li>
 </ul>
 <a name="testStep">
@@ -495,7 +499,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStep</h4>
-<pre>private static volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.589">testStep</a></pre>
+<pre>private static volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver">TestAtomicOperation.TestStep</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.628">testStep</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -504,7 +508,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>family</h4>
-<pre>private 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/regionserver/TestAtomicOperation.html#line.590">family</a></pre>
+<pre>private 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/regionserver/TestAtomicOperation.html#line.629">family</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestAtomicOperation.family">Constant Field Values</a></dd>
@@ -525,7 +529,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestAtomicOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.86">TestAtomicOperation</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.87">TestAtomicOperation</a>()</pre>
 </li>
 </ul>
 </li>
@@ -542,7 +546,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.109">setup</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.110">setup</a>()</pre>
 </li>
 </ul>
 <a name="teardown--">
@@ -551,7 +555,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>teardown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.114">teardown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.115">teardown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -565,7 +569,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppend</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.135">testAppend</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.136">testAppend</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">Test basic append operation.
  More tests in</div>
@@ -577,13 +581,27 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testAppendWithMultipleFamilies--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testAppendWithMultipleFamilies</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.155">testAppendWithMultipleFamilies</a>()
+                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+</dl>
+</li>
+</ul>
 <a name="testAppendWithNonExistingFamily--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendWithNonExistingFamily</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.154">testAppendWithNonExistingFamily</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.193">testAppendWithNonExistingFamily</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -597,7 +615,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testIncrementWithNonExistingFamily</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.172">testIncrementWithNonExistingFamily</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.211">testIncrementWithNonExistingFamily</a>()
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -611,7 +629,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testIncrementMultiThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.194">testIncrementMultiThreads</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.233">testIncrementMultiThreads</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">Test multi-threaded increments.</div>
 <dl>
@@ -626,7 +644,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertICV</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.232">assertICV</a>(byte[]&nbsp;row,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.271">assertICV</a>(byte[]&nbsp;row,
                        byte[]&nbsp;familiy,
                        byte[]&nbsp;qualifier,
                        long&nbsp;amount,
@@ -644,7 +662,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.249">initHRegion</a>(byte[]&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.288">initHRegion</a>(byte[]&nbsp;tableName,
                          <a href="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;callingMethod,
                          byte[]...&nbsp;families)
                   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>
@@ -660,7 +678,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.255">initHRegion</a>(byte[]&nbsp;tableName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.294">initHRegion</a>(byte[]&nbsp;tableName,
                          <a href="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;callingMethod,
                          int[]&nbsp;maxVersions,
                          byte[]...&nbsp;families)
@@ -677,7 +695,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendMultiThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.319">testAppendMultiThreads</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.358">testAppendMultiThreads</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -691,7 +709,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRowMutationMultiThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.381">testRowMutationMultiThreads</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.420">testRowMutationMultiThreads</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">Test multi-threaded row mutations.</div>
 <dl>
@@ -706,7 +724,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMultiRowMutationMultiThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.472">testMultiRowMutationMultiThreads</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.511">testMultiRowMutationMultiThreads</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">Test multi-threaded region mutations.</div>
 <dl>
@@ -721,7 +739,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testPutAndCheckAndPutInParallel</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.599">testPutAndCheckAndPutInParallel</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html#line.638">testPutAndCheckAndPutInParallel</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test written as a verifier for HBASE-7051, CheckAndPut should properly read
  MVCC.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index cf08121..42caa66 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -668,11 +668,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
index 4beefe2..23c5394 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.659">TestTableScan.ClientSideCellSetModel.Listener</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.702">TestTableScan.ClientSideCellSetModel.Listener</a></pre>
 <div class="block">This listener is invoked every time a new row model is unmarshalled.</div>
 </li>
 </ul>
@@ -151,7 +151,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>handleRowModel</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html#line.660">handleRowModel</a>(<a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan.ClientSideCellSetModel</a>&nbsp;helper,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html#line.703">handleRowModel</a>(<a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan.ClientSideCellSetModel</a>&nbsp;helper,
                     org.apache.hadoop.hbase.rest.model.RowModel&nbsp;rowModel)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
index e4608f3..53bf601 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.626">TestTableScan.ClientSideCellSetModel</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.669">TestTableScan.ClientSideCellSetModel</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a></pre>
 <div class="block">The Class ClientSideCellSetModel which mimics cell set model, and contains listener to perform
@@ -246,7 +246,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>serialVersionUID</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.628">serialVersionUID</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.671">serialVersionUID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.rest.TestTableScan.ClientSideCellSetModel.serialVersionUID">Constant Field Values</a></dd>
@@ -259,7 +259,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockList">
 <li class="blockList">
 <h4>row</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.rest.model.RowModel&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.635">row</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.rest.model.RowModel&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.678">row</a></pre>
 <div class="block">This list is not a real list; instead it will notify a listener whenever JAXB has
  unmarshalled the next row.</div>
 </li>
@@ -270,7 +270,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>listenerInvoked</h4>
-<pre>static&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.637">listenerInvoked</a></pre>
+<pre>static&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.680">listenerInvoked</a></pre>
 </li>
 </ul>
 </li>
@@ -287,7 +287,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ClientSideCellSetModel</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.626">ClientSideCellSetModel</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.669">ClientSideCellSetModel</a>()</pre>
 </li>
 </ul>
 </li>
@@ -304,7 +304,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setCellSetModelListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.643">setCellSetModelListener</a>(<a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html" title="interface in org.apache.hadoop.hbase.rest">TestTableScan.ClientSideCellSetModel.Listener</a>&nbsp;l)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html#line.686">setCellSetModelListener</a>(<a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html" title="interface in org.apache.hadoop.hbase.rest">TestTableScan.ClientSideCellSetModel.Listener</a>&nbsp;l)</pre>
 <div class="block">Install a listener for row model on this object. If l is null, the listener
  is removed again.</div>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
index bc00910..6724985 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.601">TestTableScan.CustomFilter</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.644">TestTableScan.CustomFilter</a>
 extends org.apache.hadoop.hbase.filter.PrefixFilter</pre>
 </li>
 </ul>
@@ -272,7 +272,7 @@ extends org.apache.hadoop.hbase.filter.PrefixFilter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>key</h4>
-<pre>private&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.602">key</a></pre>
+<pre>private&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.645">key</a></pre>
 </li>
 </ul>
 </li>
@@ -289,7 +289,7 @@ extends org.apache.hadoop.hbase.filter.PrefixFilter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CustomFilter</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.604">CustomFilter</a>(byte[]&nbsp;key)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.647">CustomFilter</a>(byte[]&nbsp;key)</pre>
 </li>
 </ul>
 </li>
@@ -306,7 +306,7 @@ extends org.apache.hadoop.hbase.filter.PrefixFilter</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.609">filterRowKey</a>(byte[]&nbsp;buffer,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.652">filterRowKey</a>(byte[]&nbsp;buffer,
                             int&nbsp;offset,
                             int&nbsp;length)</pre>
 <dl>
@@ -321,7 +321,7 @@ extends org.apache.hadoop.hbase.filter.PrefixFilter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createFilterFromArguments</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.filter.Filter&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.614">createFilterFromArguments</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;byte[]&gt;&nbsp;filterArguments)</pre>
+<pre>public static&nbsp;org.apache.hadoop.hbase.filter.Filter&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html#line.657">createFilterFromArguments</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;byte[]&gt;&nbsp;filterArguments)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.html b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.html
index 4eb907d..2e3d9f6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/rest/TestTableScan.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":9,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10};
+var methods = {"i0":10,"i1":10,"i2":9,"i3":9,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -180,17 +180,25 @@ 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/rest/TestTableScan.html#COLUMN_2">COLUMN_2</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#COLUMN_EMPTY">COLUMN_EMPTY</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#conf">conf</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#expectedRows1">expectedRows1</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#expectedRows2">expectedRows2</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#expectedRows3">expectedRows3</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#LOG">LOG</a></span></code>&nbsp;</td>
@@ -259,51 +267,55 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testCompoundFilter--">testCompoundFilter</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testColumnWithEmptyQualifier--">testColumnWithEmptyQualifier</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testCustomFilter--">testCustomFilter</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testCompoundFilter--">testCompoundFilter</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i6" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testNegativeCustomFilter--">testNegativeCustomFilter</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testCustomFilter--">testCustomFilter</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i7" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testQualifierAndPrefixFilters--">testQualifierAndPrefixFilters</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testNegativeCustomFilter--">testNegativeCustomFilter</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testReversed--">testReversed</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testQualifierAndPrefixFilters--">testQualifierAndPrefixFilters</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i9" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testScanningUnknownColumnJson--">testScanningUnknownColumnJson</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testReversed--">testReversed</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testScanningUnknownColumnJson--">testScanningUnknownColumnJson</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testScanUsingListenerUnmarshallerXML--">testScanUsingListenerUnmarshallerXML</a></span>()</code>
 <div class="block">An example to scan using listener in unmarshaller for XML.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testSimpleFilter--">testSimpleFilter</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testSimpleScannerJson--">testSimpleScannerJson</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testSimpleScannerProtobuf--">testSimpleScannerProtobuf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testSimpleScannerXML--">testSimpleScannerXML</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/rest/TestTableScan.html#testStreamingJSON--">testStreamingJSON</a></span>()</code>&nbsp;</td>
 </tr>
@@ -408,13 +420,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="COLUMN_EMPTY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>COLUMN_EMPTY</h4>
+<pre>private 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/rest/TestTableScan.html#line.93">COLUMN_EMPTY</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.rest.TestTableScan.COLUMN_EMPTY">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
 <a name="client">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>client</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.rest.client.Client <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.93">client</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.rest.client.Client <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.94">client</a></pre>
 </li>
 </ul>
 <a name="expectedRows1">
@@ -423,7 +448,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>expectedRows1</h4>
-<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.94">expectedRows1</a></pre>
+<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.95">expectedRows1</a></pre>
 </li>
 </ul>
 <a name="expectedRows2">
@@ -432,7 +457,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>expectedRows2</h4>
-<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.95">expectedRows2</a></pre>
+<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.96">expectedRows2</a></pre>
+</li>
+</ul>
+<a name="expectedRows3">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>expectedRows3</h4>
+<pre>private static&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.97">expectedRows3</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -441,7 +475,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.96">conf</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.98">conf</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -450,7 +484,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.98">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.100">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="REST_TEST_UTIL">
@@ -459,7 +493,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>REST_TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/HBaseRESTTestingUtility.html" title="class in org.apache.hadoop.hbase.rest">HBaseRESTTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.99">REST_TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/HBaseRESTTestingUtility.html" title="class in org.apache.hadoop.hbase.rest">HBaseRESTTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.101">REST_TEST_UTIL</a></pre>
 </li>
 </ul>
 </li>
@@ -493,7 +527,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.103">setUpBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.105">setUpBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -507,7 +541,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.122">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.125">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -521,7 +555,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleScannerXML</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.130">testSimpleScannerXML</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.133">testSimpleScannerXML</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>,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a>,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/stream/XMLStreamException.html?is-external=true" title="class or interface in javax.xml.stream">XMLStreamException</a></pre>
@@ -539,7 +573,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleScannerJson</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.206">testSimpleScannerJson</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.209">testSimpleScannerJson</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>,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -555,7 +589,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanUsingListenerUnmarshallerXML</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.266">testScanUsingListenerUnmarshallerXML</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.269">testScanUsingListenerUnmarshallerXML</a>()
                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">An example to scan using listener in unmarshaller for XML.</div>
 <dl>
@@ -570,7 +604,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStreamingJSON</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.318">testStreamingJSON</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.321">testStreamingJSON</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -584,7 +618,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleScannerProtobuf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.360">testSimpleScannerProtobuf</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.363">testSimpleScannerProtobuf</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -598,7 +632,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkRowsNotNull</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.391">checkRowsNotNull</a>(org.apache.hadoop.hbase.rest.model.CellSetModel&nbsp;model)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.394">checkRowsNotNull</a>(org.apache.hadoop.hbase.rest.model.CellSetModel&nbsp;model)</pre>
 </li>
 </ul>
 <a name="readProtobufStream-java.io.InputStream-">
@@ -607,7 +641,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readProtobufStream</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.404">readProtobufStream</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a>&nbsp;inputStream)
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.407">readProtobufStream</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</a>&nbsp;inputStream)
                        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">Read protobuf stream.</div>
 <dl>
@@ -626,7 +660,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanningUnknownColumnJson</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.433">testScanningUnknownColumnJson</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.436">testScanningUnknownColumnJson</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>,
                                           <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -642,7 +676,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.451">testSimpleFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.454">testSimpleFilter</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>,
                              <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -658,7 +692,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testQualifierAndPrefixFilters</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.475">testQualifierAndPrefixFilters</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.478">testQualifierAndPrefixFilters</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>,
                                           <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -674,7 +708,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompoundFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.494">testCompoundFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.497">testCompoundFilter</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>,
                                <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -690,7 +724,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCustomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.513">testCustomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.516">testCustomFilter</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>,
                              <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -706,7 +740,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNegativeCustomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.533">testNegativeCustomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.536">testNegativeCustomFilter</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>,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -719,10 +753,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testReversed--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testReversed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.552">testReversed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.555">testReversed</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>,
                          <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
 <dl>
@@ -732,6 +766,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testColumnWithEmptyQualifier--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testColumnWithEmptyQualifier</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TestTableScan.html#line.605">testColumnWithEmptyQualifier</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>,
+                                         <a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<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></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBException.html?is-external=true" title="class or interface in javax.xml.bind">JAXBException</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html
index eb943b1..5069fc9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <dl>
 <dt>Direct Known Subclasses:</dt>
-<dd><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobExportSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestSecureExportSnapshot</a></dd>
+<dd><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot">TestExportSnapshotWithTemporaryDirectory</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestMobExportSnapshot</a>, <a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.html" title="class in org.apache.hadoop.hbase.snapshot">TestSecureExportSnapshot</a></dd>
 </dl>
 <hr>
 <br>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html
index 2bc07d6..17ab2ab 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotHelpers.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" target="_top">Frames</a></li>
@@ -393,7 +393,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotHelpers.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html" target="_top">Frames</a></li>


[02/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.html
index 826bcba..5323511 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.html
@@ -98,580 +98,623 @@
 <span class="sourceLineNo">090</span>  private static final String CFB = "b";<a name="line.90"></a>
 <span class="sourceLineNo">091</span>  private static final String COLUMN_1 = CFA + ":1";<a name="line.91"></a>
 <span class="sourceLineNo">092</span>  private static final String COLUMN_2 = CFB + ":2";<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static Client client;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static int expectedRows1;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static int expectedRows2;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static Configuration conf;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    new HBaseRESTTestingUtility();<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @BeforeClass<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public static void setUpBeforeClass() throws Exception {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    conf = TEST_UTIL.getConfiguration();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    TEST_UTIL.startMiniCluster();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    client = new Client(new Cluster().add("localhost",<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      REST_TEST_UTIL.getServletPort()));<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    if (!admin.tableExists(TABLE)) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    htd.addFamily(new HColumnDescriptor(CFA));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htd.addFamily(new HColumnDescriptor(CFB));<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    admin.createTable(htd);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<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>  @AfterClass<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public static void tearDownAfterClass() throws Exception {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    // Test scanning particular columns<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    StringBuilder builder = new StringBuilder();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    builder.append("/*");<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    builder.append("?");<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    builder.append("&amp;");<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      Constants.MIMETYPE_XML);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    assertEquals(200, response.getCode());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    int count = TestScannerResource.countCellSet(model);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    assertEquals(10, count);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    checkRowsNotNull(model);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>    //Test with no limit.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    builder = new StringBuilder();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    builder.append("/*");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    builder.append("?");<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      Constants.MIMETYPE_XML);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    assertEquals(200, response.getCode());<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    count = TestScannerResource.countCellSet(model);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(expectedRows1, count);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    checkRowsNotNull(model);<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    //Test with start and end row.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    builder = new StringBuilder();<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    builder.append("/*");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    builder.append("?");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    builder.append("&amp;");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    builder.append("&amp;");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Constants.MIMETYPE_XML);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    assertEquals(200, response.getCode());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    count = TestScannerResource.countCellSet(model);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    RowModel startRow = model.getRows().get(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    assertEquals(24, count);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    checkRowsNotNull(model);<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    //Test with start row and limit.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    builder = new StringBuilder();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    builder.append("/*");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    builder.append("?");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    builder.append("&amp;");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    builder.append("&amp;");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      Constants.MIMETYPE_XML);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    assertEquals(200, response.getCode());<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    startRow = model.getRows().get(0);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    count = TestScannerResource.countCellSet(model);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    assertEquals(15, count);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    checkRowsNotNull(model);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    // Test scanning particular columns with limit.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    StringBuilder builder = new StringBuilder();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    builder.append("/*");<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    builder.append("?");<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    builder.append("&amp;");<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      Constants.MIMETYPE_JSON);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    assertEquals(200, response.getCode());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    int count = TestScannerResource.countCellSet(model);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    assertEquals(2, count);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    checkRowsNotNull(model);<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    //Test scanning with no limit.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    builder = new StringBuilder();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    builder.append("/*");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    builder.append("?");<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      Constants.MIMETYPE_JSON);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    assertEquals(200, response.getCode());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    count = TestScannerResource.countCellSet(model);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    assertEquals(expectedRows2, count);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    checkRowsNotNull(model);<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    //Test with start row and end row.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    builder = new StringBuilder();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    builder.append("/*");<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    builder.append("?");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    builder.append("&amp;");<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    builder.append("&amp;");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      Constants.MIMETYPE_JSON);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    assertEquals(200, response.getCode());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    RowModel startRow = model.getRows().get(0);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    count = TestScannerResource.countCellSet(model);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertEquals(24, count);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    checkRowsNotNull(model);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * @throws Exception the exception<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  @Test<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    StringBuilder builder = new StringBuilder();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    builder.append("/*");<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    builder.append("?");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    builder.append("&amp;");<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      Constants.MIMETYPE_XML);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    assertEquals(200, response.getCode());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      CellModel.class);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        assertTrue(row.getKey() != null);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    };<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    });<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // create a new XML parser<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    factory.setNamespaceAware(true);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    reader.parse(new InputSource(response.getStream()));<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  @Test<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public void testStreamingJSON() throws Exception {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    //Test with start row and end row.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    StringBuilder builder = new StringBuilder();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    builder.append("/*");<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    builder.append("?");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    builder.append("&amp;");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    builder.append("&amp;");<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      Constants.MIMETYPE_JSON);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    assertEquals(200, response.getCode());<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    int count = 0;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean found = false;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        assertNotNull(row.getKey());<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          if (count == 0) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          if (count == 23) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.347"></a>
+<span class="sourceLineNo">093</span>  private static final String COLUMN_EMPTY = CFA + ":";<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static Client client;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static int expectedRows1;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private static int expectedRows2;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private static int expectedRows3;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static Configuration conf;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    new HBaseRESTTestingUtility();<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @BeforeClass<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static void setUpBeforeClass() throws Exception {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    conf = TEST_UTIL.getConfiguration();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    TEST_UTIL.startMiniCluster();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    client = new Client(new Cluster().add("localhost",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      REST_TEST_UTIL.getServletPort()));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    if (!admin.tableExists(TABLE)) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      htd.addFamily(new HColumnDescriptor(CFA));<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      htd.addFamily(new HColumnDescriptor(CFB));<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      admin.createTable(htd);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      expectedRows3 = TestScannerResource.insertData(conf, TABLE, COLUMN_EMPTY, 1.0);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @AfterClass<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static void tearDownAfterClass() throws Exception {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  @Test<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Test scanning particular columns<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    StringBuilder builder = new StringBuilder();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    builder.append("/*");<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    builder.append("?");<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    builder.append("&amp;");<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      Constants.MIMETYPE_XML);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    assertEquals(200, response.getCode());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    int count = TestScannerResource.countCellSet(model);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    assertEquals(10, count);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    checkRowsNotNull(model);<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    //Test with no limit.<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    builder = new StringBuilder();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    builder.append("/*");<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    builder.append("?");<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      Constants.MIMETYPE_XML);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertEquals(200, response.getCode());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    count = TestScannerResource.countCellSet(model);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    assertEquals(expectedRows1, count);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    checkRowsNotNull(model);<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    //Test with start and end row.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    builder = new StringBuilder();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    builder.append("/*");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    builder.append("?");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    builder.append("&amp;");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    builder.append("&amp;");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      Constants.MIMETYPE_XML);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    assertEquals(200, response.getCode());<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    count = TestScannerResource.countCellSet(model);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    RowModel startRow = model.getRows().get(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertEquals(24, count);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    checkRowsNotNull(model);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    //Test with start row and limit.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    builder = new StringBuilder();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    builder.append("/*");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    builder.append("?");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    builder.append("&amp;");<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    builder.append("&amp;");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      Constants.MIMETYPE_XML);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    assertEquals(200, response.getCode());<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    startRow = model.getRows().get(0);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    count = TestScannerResource.countCellSet(model);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    assertEquals(15, count);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    checkRowsNotNull(model);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @Test<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Test scanning particular columns with limit.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    StringBuilder builder = new StringBuilder();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    builder.append("/*");<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    builder.append("?");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    builder.append("&amp;");<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      Constants.MIMETYPE_JSON);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    assertEquals(200, response.getCode());<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    int count = TestScannerResource.countCellSet(model);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    assertEquals(2, count);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    checkRowsNotNull(model);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>    //Test scanning with no limit.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    builder = new StringBuilder();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    builder.append("/*");<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    builder.append("?");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      Constants.MIMETYPE_JSON);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    assertEquals(200, response.getCode());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    count = TestScannerResource.countCellSet(model);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    assertEquals(expectedRows2, count);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    checkRowsNotNull(model);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    //Test with start row and end row.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    builder = new StringBuilder();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    builder.append("/*");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    builder.append("?");<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    builder.append("&amp;");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    builder.append("&amp;");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      Constants.MIMETYPE_JSON);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    assertEquals(200, response.getCode());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    RowModel startRow = model.getRows().get(0);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    count = TestScannerResource.countCellSet(model);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    assertEquals(24, count);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    checkRowsNotNull(model);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>  /**<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @throws Exception the exception<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    StringBuilder builder = new StringBuilder();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    builder.append("/*");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    builder.append("?");<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    builder.append("&amp;");<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      Constants.MIMETYPE_XML);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(200, response.getCode());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      CellModel.class);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        assertTrue(row.getKey() != null);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    };<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        @Override<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<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>        @Override<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<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>    });<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // create a new XML parser<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    factory.setNamespaceAware(true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    reader.parse(new InputSource(response.getStream()));<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<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><a name="line.319"></a>
+<span class="sourceLineNo">320</span>  @Test<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  public void testStreamingJSON() throws Exception {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    //Test with start row and end row.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    StringBuilder builder = new StringBuilder();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    builder.append("/*");<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    builder.append("?");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    builder.append("&amp;");<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    builder.append("&amp;");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      Constants.MIMETYPE_JSON);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(200, response.getCode());<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    int count = 0;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean found = false;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        assertNotNull(row.getKey());<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          if (count == 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.347"></a>
 <span class="sourceLineNo">348</span>          }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          count++;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        jParser.skipChildren();<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      } else {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    assertEquals(24, count);<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>  @Test<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    StringBuilder builder = new StringBuilder();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    builder.append("/*");<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    builder.append("?");<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    builder.append("&amp;");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    assertEquals(200, response.getCode());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    assertEquals(15, rowCount);<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>    //Test with start row and end row.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    builder = new StringBuilder();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    builder.append("/*");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    builder.append("?");<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    builder.append("&amp;");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    builder.append("&amp;");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    assertEquals(200, response.getCode());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    rowCount = readProtobufStream(response.getStream());<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    assertEquals(24, rowCount);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private void checkRowsNotNull(CellSetModel model) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    for (RowModel row: model.getRows()) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      assertTrue(row.getKey() != null);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    }<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>   * Read protobuf stream.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * @param inputStream the input stream<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @return The number of rows in the cell set model.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    CellSetModel model = null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    int rowCount = 0;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    try {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      while (true) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        byte[] lengthBytes = new byte[2];<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        int readBytes = stream.read(lengthBytes);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        if (readBytes == -1) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          break;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        assertEquals(2, readBytes);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        int length = Bytes.toShort(lengthBytes);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        byte[] cellset = new byte[length];<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        stream.read(cellset);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        model = new CellSetModel();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        model.getObjectFromMessage(cellset);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        checkRowsNotNull(model);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    } catch (EOFException exp) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      exp.printStackTrace();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    } finally {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      stream.close();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return rowCount;<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>  @Test<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    // Test scanning particular columns with limit.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    StringBuilder builder = new StringBuilder();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    builder.append("/*");<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    builder.append("?");<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      Constants.MIMETYPE_JSON);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    assertEquals(200, response.getCode());<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    int count = TestScannerResource.countCellSet(model);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    assertEquals(0, count);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>  @Test<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public void testSimpleFilter() throws IOException, JAXBException {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    StringBuilder builder = new StringBuilder();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    builder.append("/*");<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    builder.append("?");<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    builder.append("&amp;");<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    builder.append("&amp;");<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    builder.append("&amp;");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("PrefixFilter('aab')", "UTF-8"));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    Response response =<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(200, response.getCode());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    int count = TestScannerResource.countCellSet(model);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    assertEquals(1, count);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    assertEquals("aab",<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testQualifierAndPrefixFilters() throws IOException, JAXBException {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    StringBuilder builder = new StringBuilder();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    builder.append("/abc*");<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    builder.append("?");<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + URLEncoder.encode("QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    Response response =<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    assertEquals(200, response.getCode());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    int count = TestScannerResource.countCellSet(model);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    assertEquals(1, count);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    assertEquals("abc",<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  @Test<a name="line.493"></a>
-<span class="sourceLineNo">494</span>  public void testCompoundFilter() throws IOException, JAXBException {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    StringBuilder builder = new StringBuilder();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    builder.append("/*");<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    builder.append("?");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        + URLEncoder.encode("PrefixFilter('abc') AND QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    Response response =<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    assertEquals(200, response.getCode());<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    int count = TestScannerResource.countCellSet(model);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assertEquals(1, count);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    assertEquals("abc",<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>  @Test<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  public void testCustomFilter() throws IOException, JAXBException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    StringBuilder builder = new StringBuilder();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    builder.append("/a*");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    builder.append("?");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    builder.append("&amp;");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    Response response =<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertEquals(200, response.getCode());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    int count = TestScannerResource.countCellSet(model);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    assertEquals(1, count);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    assertEquals("abc",<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  @Test<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public void testNegativeCustomFilter() throws IOException, JAXBException {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    StringBuilder builder = new StringBuilder();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    builder.append("/b*");<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    builder.append("?");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    builder.append("&amp;");<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    Response response =<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    assertEquals(200, response.getCode());<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    int count = TestScannerResource.countCellSet(model);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Should return no rows as the filters conflict<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    assertEquals(0, count);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  @Test<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  public void testReversed() throws IOException, JAXBException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    StringBuilder builder = new StringBuilder();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    builder.append("/*");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    builder.append("?");<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    builder.append("&amp;");<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    builder.append("&amp;");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Response response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    assertEquals(200, response.getCode());<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    int count = TestScannerResource.countCellSet(model);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    assertEquals(24, count);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    List&lt;RowModel&gt; rowModels = model.getRows().subList(1, count);<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    //reversed<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    builder = new StringBuilder();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    builder.append("/*");<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    builder.append("?");<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    builder.append("&amp;");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    builder.append(Constants.SCAN_START_ROW + "=aay");<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    builder.append("&amp;");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    builder.append(Constants.SCAN_END_ROW + "=aaa");<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    builder.append("&amp;");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    builder.append(Constants.SCAN_REVERSED + "=true");<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    assertEquals(200, response.getCode());<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    count = TestScannerResource.countCellSet(model);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    assertEquals(24, count);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    List&lt;RowModel&gt; reversedRowModels = model.getRows().subList(1, count);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    Collections.reverse(reversedRowModels);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    assertEquals(rowModels.size(), reversedRowModels.size());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    for (int i = 0; i &lt; rowModels.size(); i++) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      RowModel rowModel = rowModels.get(i);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      RowModel reversedRowModel = reversedRowModels.get(i);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>      assertEquals(new String(rowModel.getKey(), "UTF-8"),<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          new String(reversedRowModel.getKey(), "UTF-8"));<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      assertEquals(new String(rowModel.getCells().get(0).getValue(), "UTF-8"),<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          new String(reversedRowModel.getCells().get(0).getValue(), "UTF-8"));<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>  public static class CustomFilter extends PrefixFilter {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    private byte[] key = null;<a name="line.602"></a>
+<span class="sourceLineNo">349</span>          if (count == 23) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>          count++;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        jParser.skipChildren();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      } else {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<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>    assertEquals(24, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Test<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    StringBuilder builder = new StringBuilder();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    builder.append("/*");<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    builder.append("?");<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    builder.append("&amp;");<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    assertEquals(200, response.getCode());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    assertEquals(15, rowCount);<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    //Test with start row and end row.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    builder = new StringBuilder();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    builder.append("/*");<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    builder.append("?");<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    builder.append("&amp;");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    builder.append("&amp;");<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    assertEquals(200, response.getCode());<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    rowCount = readProtobufStream(response.getStream());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    assertEquals(24, rowCount);<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>  private void checkRowsNotNull(CellSetModel model) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    for (RowModel row: model.getRows()) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      assertTrue(row.getKey() != null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * Read protobuf stream.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   * @param inputStream the input stream<a name="line.403"></a>
+<span class="sourceLineNo">404</span>   * @return The number of rows in the cell set model.<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   */<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    CellSetModel model = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    int rowCount = 0;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      while (true) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        byte[] lengthBytes = new byte[2];<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        int readBytes = stream.read(lengthBytes);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        if (readBytes == -1) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          break;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        assertEquals(2, readBytes);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        int length = Bytes.toShort(lengthBytes);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        byte[] cellset = new byte[length];<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        stream.read(cellset);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        model = new CellSetModel();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        model.getObjectFromMessage(cellset);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        checkRowsNotNull(model);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    } catch (EOFException exp) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      exp.printStackTrace();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      stream.close();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return rowCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  @Test<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // Test scanning particular columns with limit.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    StringBuilder builder = new StringBuilder();<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    builder.append("/*");<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    builder.append("?");<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Constants.MIMETYPE_JSON);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    assertEquals(200, response.getCode());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    int count = TestScannerResource.countCellSet(model);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    assertEquals(0, count);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>  @Test<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  public void testSimpleFilter() throws 

<TRUNCATED>

[15/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html
new file mode 100644
index 0000000..149326d
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectory.html
@@ -0,0 +1,543 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * &lt;p&gt;<a name="line.9"></a>
+<span class="sourceLineNo">010</span> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> * &lt;p&gt;<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.client;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import static org.junit.Assert.assertEquals;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import static org.junit.Assert.assertFalse;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import static org.junit.Assert.assertTrue;<a name="line.22"></a>
+<span class="sourceLineNo">023</span><a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.io.File;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.nio.file.Paths;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Iterator;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.UUID;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.commons.io.FileUtils;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.conf.Configuration;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.FileSystem;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.Path;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HConstants;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.TableName;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifestV1;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifestV2;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.junit.After;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.junit.AfterClass;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.Before;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.BeforeClass;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.ClassRule;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.Test;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.experimental.categories.Category;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.junit.runner.RunWith;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.junit.runners.Parameterized;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>/**<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * This class tests that the use of a temporary snapshot directory supports snapshot functionality<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * while the temporary directory is on a different file system than the root directory<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;p&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * This is an end-to-end test for the snapshot utility<a name="line.70"></a>
+<span class="sourceLineNo">071</span> */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>@Category(LargeTests.class)<a name="line.72"></a>
+<span class="sourceLineNo">073</span>@RunWith(Parameterized.class)<a name="line.73"></a>
+<span class="sourceLineNo">074</span>public class TestSnapshotTemporaryDirectory {<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  @ClassRule public static final HBaseClassTestRule CLASS_RULE =<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      HBaseClassTestRule.forClass(TestSnapshotTemporaryDirectory.class);<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  @Parameterized.Parameters public static Iterable&lt;Integer&gt; data() {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    return Arrays<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        .asList(SnapshotManifestV1.DESCRIPTOR_VERSION, SnapshotManifestV2.DESCRIPTOR_VERSION);<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>  @Parameterized.Parameter public int manifestVersion;<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSnapshotTemporaryDirectory.class);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  protected static final int NUM_RS = 2;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  protected static String TEMP_DIR =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      Paths.get("").toAbsolutePath().toString() + Path.SEPARATOR + UUID.randomUUID().toString();<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  protected static Admin admin;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  protected static final HBaseTestingUtility UTIL = new HBaseTestingUtility();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  protected static final String STRING_TABLE_NAME = "test";<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  protected static final byte[] TEST_FAM = Bytes.toBytes("fam");<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  protected static final TableName TABLE_NAME = TableName.valueOf(STRING_TABLE_NAME);<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>   * Setup the config for the cluster<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   *<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * @throws Exception on failure<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  @BeforeClass public static void setupCluster() throws Exception {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    setupConf(UTIL.getConfiguration());<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    UTIL.startMiniCluster(NUM_RS);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    admin = UTIL.getHBaseAdmin();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  private static void setupConf(Configuration conf) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // disable the ui<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    conf.setInt("hbase.regionsever.info.port", -1);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    // change the flush size to a small amount, regulating number of store files<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    conf.setInt("hbase.hregion.memstore.flush.size", 25000);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    // so make sure we get a compaction when doing a load, but keep around some<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    // files in the store<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    conf.setInt("hbase.hstore.compaction.min", 10);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    conf.setInt("hbase.hstore.compactionThreshold", 10);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // block writes if we get to 12 store files<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    conf.setInt("hbase.hstore.blockingStoreFiles", 12);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    // Enable snapshot<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    conf.setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        ConstantSizeRegionSplitPolicy.class.getName());<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    conf.set(SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR, "file://" + TEMP_DIR + "/.tmpdir/");<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Before public void setup() throws Exception {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    HTableDescriptor htd = new HTableDescriptor(TABLE_NAME);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    htd.setRegionReplication(getNumReplicas());<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    UTIL.createTable(htd, new byte[][] { TEST_FAM }, UTIL.getConfiguration());<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  protected int getNumReplicas() {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return 1;<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>  @After public void tearDown() throws Exception {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    UTIL.deleteTable(TABLE_NAME);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    SnapshotTestingUtils.deleteAllSnapshots(UTIL.getHBaseAdmin());<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    SnapshotTestingUtils.deleteArchiveDirectory(UTIL);<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>  @AfterClass public static void cleanupTest() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    try {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      UTIL.shutdownMiniCluster();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      FileUtils.deleteDirectory(new File(TEMP_DIR));<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    } catch (Exception e) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      LOG.warn("failure shutting down cluster", e);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  @Test(timeout = 180000) public void testRestoreDisabledSnapshot()<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      throws IOException, InterruptedException {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    long tid = System.currentTimeMillis();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    TableName tableName = TableName.valueOf("testtb-" + tid);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    byte[] emptySnapshot = Bytes.toBytes("emptySnaptb-" + tid);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    byte[] snapshotName0 = Bytes.toBytes("snaptb0-" + tid);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    byte[] snapshotName1 = Bytes.toBytes("snaptb1-" + tid);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    int snapshot0Rows;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    int snapshot1Rows;<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    // create Table and disable it<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    SnapshotTestingUtils.createTable(UTIL, tableName, getNumReplicas(), TEST_FAM);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    admin.disableTable(tableName);<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>    // take an empty snapshot<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    takeSnapshot(tableName, Bytes.toString(emptySnapshot), true);<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>    // enable table and insert data<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    admin.enableTable(tableName);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    SnapshotTestingUtils.loadData(UTIL, tableName, 500, TEST_FAM);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    try (Table table = UTIL.getConnection().getTable(tableName)) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      snapshot0Rows = UTIL.countRows(table);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    admin.disableTable(tableName);<a name="line.174"></a>
+<span class="sourceLineNo">175</span><a name="line.175"></a>
+<span class="sourceLineNo">176</span>    // take a snapshot<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    takeSnapshot(tableName, Bytes.toString(snapshotName0), true);<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // enable table and insert more data<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    admin.enableTable(tableName);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    SnapshotTestingUtils.loadData(UTIL, tableName, 500, TEST_FAM);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    try (Table table = UTIL.getConnection().getTable(tableName)) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      snapshot1Rows = UTIL.countRows(table);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    admin.disableTable(tableName);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    takeSnapshot(tableName, Bytes.toString(snapshotName1), true);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // Restore from snapshot-0<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    admin.restoreSnapshot(snapshotName0);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    admin.enableTable(tableName);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot0Rows);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // Restore from emptySnapshot<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    admin.disableTable(tableName);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    admin.restoreSnapshot(emptySnapshot);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    admin.enableTable(tableName);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, 0);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.201"></a>
+<span class="sourceLineNo">202</span><a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // Restore from snapshot-1<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    admin.disableTable(tableName);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    admin.restoreSnapshot(snapshotName1);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    admin.enableTable(tableName);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Restore from snapshot-1<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    UTIL.deleteTable(tableName);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    admin.restoreSnapshot(snapshotName1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  @Test(timeout = 180000) public void testRestoreEnabledSnapshot()<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      throws IOException, InterruptedException {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    long tid = System.currentTimeMillis();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    TableName tableName = TableName.valueOf("testtb-" + tid);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    byte[] emptySnapshot = Bytes.toBytes("emptySnaptb-" + tid);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    byte[] snapshotName0 = Bytes.toBytes("snaptb0-" + tid);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    byte[] snapshotName1 = Bytes.toBytes("snaptb1-" + tid);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    int snapshot0Rows;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    int snapshot1Rows;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // create Table<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    SnapshotTestingUtils.createTable(UTIL, tableName, getNumReplicas(), TEST_FAM);<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // take an empty snapshot<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    takeSnapshot(tableName, Bytes.toString(emptySnapshot), false);<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span>    // Insert data<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    SnapshotTestingUtils.loadData(UTIL, tableName, 500, TEST_FAM);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    try (Table table = UTIL.getConnection().getTable(tableName)) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      snapshot0Rows = UTIL.countRows(table);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // take a snapshot<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    takeSnapshot(tableName, Bytes.toString(snapshotName0), false);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    // Insert more data<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    SnapshotTestingUtils.loadData(UTIL, tableName, 500, TEST_FAM);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    try (Table table = UTIL.getConnection().getTable(tableName)) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      snapshot1Rows = UTIL.countRows(table);<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>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    takeSnapshot(tableName, Bytes.toString(snapshotName1), false);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // Restore from snapshot-0<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    admin.disableTable(tableName);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    admin.restoreSnapshot(snapshotName0);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    admin.enableTable(tableName);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot0Rows);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>    // Restore from emptySnapshot<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    admin.disableTable(tableName);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    admin.restoreSnapshot(emptySnapshot);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    admin.enableTable(tableName);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, 0);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>    // Restore from snapshot-1<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    admin.disableTable(tableName);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    admin.restoreSnapshot(snapshotName1);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    admin.enableTable(tableName);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    // Restore from snapshot-1<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    UTIL.deleteTable(tableName);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    admin.restoreSnapshot(snapshotName1);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    SnapshotTestingUtils.verifyRowCount(UTIL, tableName, snapshot1Rows);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    SnapshotTestingUtils.verifyReplicasCameOnline(tableName, admin, getNumReplicas());<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  /**<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * Test snapshotting a table that is offline<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   *<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @throws Exception if snapshot does not complete successfully<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @Test(timeout = 300000) public void testOfflineTableSnapshot() throws Exception {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    Admin admin = UTIL.getHBaseAdmin();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    // make sure we don't fail on listing snapshots<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    SnapshotTestingUtils.assertNoSnapshots(admin);<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>    // put some stuff in the table<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    Table table = UTIL.getConnection().getTable(TABLE_NAME);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    UTIL.loadTable(table, TEST_FAM, false);<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>    LOG.debug("FS state before disable:");<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    FSUtils<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        .logFileSystemState(UTIL.getTestFileSystem(), FSUtils.getRootDir(UTIL.getConfiguration()),<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            LOG);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    // XXX if this is flakey, might want to consider using the async version and looping as<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    // disableTable can succeed and still timeout.<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    admin.disableTable(TABLE_NAME);<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>    LOG.debug("FS state before snapshot:");<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    FSUtils<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        .logFileSystemState(UTIL.getTestFileSystem(), FSUtils.getRootDir(UTIL.getConfiguration()),<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            LOG);<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // take a snapshot of the disabled table<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    final String SNAPSHOT_NAME = "offlineTableSnapshot";<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    byte[] snapshot = Bytes.toBytes(SNAPSHOT_NAME);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    takeSnapshot(TABLE_NAME, SNAPSHOT_NAME, true);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    LOG.debug("Snapshot completed.");<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>    // make sure we have the snapshot<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    List&lt;SnapshotDescription&gt; snapshots =<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        SnapshotTestingUtils.assertOneSnapshotThatMatches(admin, snapshot, TABLE_NAME);<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    // make sure its a valid snapshot<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    LOG.debug("FS state after snapshot:");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    FSUtils<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        .logFileSystemState(UTIL.getTestFileSystem(), FSUtils.getRootDir(UTIL.getConfiguration()),<a name="line.321"></a>
+<span class="sourceLineNo">322</span>            LOG);<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>    SnapshotTestingUtils<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        .confirmSnapshotValid(ProtobufUtil.createHBaseProtosSnapshotDesc(snapshots.get(0)),<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            TABLE_NAME, TEST_FAM, rootDir, admin, fs);<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>    admin.deleteSnapshot(snapshot);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    SnapshotTestingUtils.assertNoSnapshots(admin);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * Tests that snapshot has correct contents by taking snapshot, cloning it, then affirming<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * the contents of the original and cloned table match<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   *<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * @throws Exception if snapshot does not complete successfully<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  @Test(timeout = 180000) public void testSnapshotCloneContents() throws Exception {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    // make sure we don't fail on listing snapshots<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    SnapshotTestingUtils.assertNoSnapshots(admin);<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>    // put some stuff in the table<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    Table table = UTIL.getConnection().getTable(TABLE_NAME);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    UTIL.loadTable(table, TEST_FAM);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    table.close();<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>    String snapshot1 = "TableSnapshot1";<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    takeSnapshot(TABLE_NAME, snapshot1, false);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    LOG.debug("Snapshot1 completed.");<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    TableName clone = TableName.valueOf("Table1Clone");<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    admin.cloneSnapshot(snapshot1, clone, false);<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>    Scan original = new Scan();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    Scan cloned = new Scan();<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    ResultScanner originalScan = admin.getConnection().getTable(TABLE_NAME).getScanner(original);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    ResultScanner clonedScan =<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        admin.getConnection().getTable(TableName.valueOf("Table1Clone")).getScanner(cloned);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>    Iterator&lt;Result&gt; i = originalScan.iterator();<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    Iterator&lt;Result&gt; i2 = clonedScan.iterator();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    assertTrue(i.hasNext());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    while (i.hasNext()) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      assertTrue(i2.hasNext());<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      assertEquals(Bytes.toString(i.next().getValue(TEST_FAM, new byte[] {})),<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          Bytes.toString(i2.next().getValue(TEST_FAM, new byte[] {})));<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    assertFalse(i2.hasNext());<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    admin.deleteSnapshot(snapshot1);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    UTIL.deleteTable(clone);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    admin.close();<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>  @Test(timeout = 180000) public void testOfflineTableSnapshotWithEmptyRegion() throws Exception {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    // test with an empty table with one region<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    // make sure we don't fail on listing snapshots<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    SnapshotTestingUtils.assertNoSnapshots(admin);<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    LOG.debug("FS state before disable:");<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    FSUtils<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        .logFileSystemState(UTIL.getTestFileSystem(), FSUtils.getRootDir(UTIL.getConfiguration()),<a name="line.382"></a>
+<span class="sourceLineNo">383</span>            LOG);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    admin.disableTable(TABLE_NAME);<a name="line.384"></a>
+<span class="sourceLineNo">385</span><a name="line.385"></a>
+<span class="sourceLineNo">386</span>    LOG.debug("FS state before snapshot:");<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    FSUtils<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        .logFileSystemState(UTIL.getTestFileSystem(), FSUtils.getRootDir(UTIL.getConfiguration()),<a name="line.388"></a>
+<span class="sourceLineNo">389</span>            LOG);<a name="line.389"></a>
+<span class="sourceLineNo">390</span><a name="line.390"></a>
+<span class="sourceLineNo">391</span>    // take a snapshot of the disabled table<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    byte[] snapshot = Bytes.toBytes("testOfflineTableSnapshotWithEmptyRegion");<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    takeSnapshot(TABLE_NAME, Bytes.toString(snapshot), true);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    LOG.debug("Snapshot completed.");<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>    // make sure we have the snapshot<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    List&lt;SnapshotDescription&gt; snapshots =<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        SnapshotTestingUtils.assertOneSnapshotThatMatches(admin, snapshot, TABLE_NAME);<a name="line.398"></a>
+<span class="sourceLineNo">399</span><a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // make sure its a valid snapshot<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    FileSystem fs = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getFileSystem();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    Path rootDir = UTIL.getHBaseCluster().getMaster().getMasterFileSystem().getRootDir();<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    LOG.debug("FS state after snapshot:");<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    FSUtils<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        .logFileSystemState(UTIL.getTestFileSystem(), FSUtils.getRootDir(UTIL.getConfiguration()),<a name="line.405"></a>
+<span class="sourceLineNo">406</span>            LOG);<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>    List&lt;byte[]&gt; emptyCfs = Lists.newArrayList(TEST_FAM); // no file in the region<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    List&lt;byte[]&gt; nonEmptyCfs = Lists.newArrayList();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    SnapshotTestingUtils<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        .confirmSnapshotValid(ProtobufUtil.createHBaseProtosSnapshotDesc(snapshots.get(0)),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            TABLE_NAME, nonEmptyCfs, emptyCfs, rootDir, admin, fs);<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    admin.deleteSnapshot(snapshot);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    SnapshotTestingUtils.assertNoSnapshots(admin);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  // Ensures that the snapshot is transferred to the proper completed snapshot directory<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  @Test(timeout = 180000) public void testEnsureTemporaryDirectoryTransfer() throws Exception {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    Admin admin = null;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    TableName tableName2 = TableName.valueOf("testListTableSnapshots");<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      admin = UTIL.getHBaseAdmin();<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>      HTableDescriptor htd = new HTableDescriptor(tableName2);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      UTIL.createTable(htd, new byte[][] { TEST_FAM }, UTIL.getConfiguration());<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>      String table1Snapshot1 = "Table1Snapshot1";<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      takeSnapshot(TABLE_NAME, table1Snapshot1, false);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      LOG.debug("Snapshot1 completed.");<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      String table1Snapshot2 = "Table1Snapshot2";<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      takeSnapshot(TABLE_NAME, table1Snapshot2, false);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      LOG.debug("Snapshot2 completed.");<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      String table2Snapshot1 = "Table2Snapshot1";<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      takeSnapshot(TABLE_NAME, table2Snapshot1, false);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      LOG.debug("Table2Snapshot1 completed.");<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      List&lt;SnapshotDescription&gt; listTableSnapshots = admin.listTableSnapshots("test.*", ".*");<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      List&lt;String&gt; listTableSnapshotNames = new ArrayList&lt;String&gt;();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>      assertEquals(3, listTableSnapshots.size());<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      for (SnapshotDescription s : listTableSnapshots) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        listTableSnapshotNames.add(s.getName());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      }<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      assertTrue(listTableSnapshotNames.contains(table1Snapshot1));<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      assertTrue(listTableSnapshotNames.contains(table1Snapshot2));<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      assertTrue(listTableSnapshotNames.contains(table2Snapshot1));<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    } finally {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      if (admin != null) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>        try {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>          admin.deleteSnapshots("Table.*");<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        } catch (SnapshotDoesNotExistException ignore) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        if (admin.tableExists(tableName2)) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>          UTIL.deleteTable(tableName2);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        admin.close();<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>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  private void takeSnapshot(TableName tableName, String snapshotName, boolean disabled)<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      throws IOException {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    SnapshotType type = disabled ? SnapshotType.DISABLED : SnapshotType.FLUSH;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    SnapshotDescription desc =<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        new SnapshotDescription(snapshotName, tableName.getNameAsString(), type, null, -1,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            manifestVersion);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    admin.snapshot(desc);<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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
new file mode 100644
index 0000000..939ddd0
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestSnapshotTemporaryDirectoryWithRegionReplicas.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.client;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.junit.ClassRule;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.junit.experimental.categories.Category;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>@Category(LargeTests.class)<a name="line.25"></a>
+<span class="sourceLineNo">026</span>public class TestSnapshotTemporaryDirectoryWithRegionReplicas<a name="line.26"></a>
+<span class="sourceLineNo">027</span>    extends TestSnapshotTemporaryDirectory {<a name="line.27"></a>
+<span class="sourceLineNo">028</span><a name="line.28"></a>
+<span class="sourceLineNo">029</span>  @ClassRule<a name="line.29"></a>
+<span class="sourceLineNo">030</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.30"></a>
+<span class="sourceLineNo">031</span>      HBaseClassTestRule.forClass(TestSnapshotTemporaryDirectoryWithRegionReplicas.class);<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>  @Override<a name="line.33"></a>
+<span class="sourceLineNo">034</span>  protected int getNumReplicas() {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>    return 3;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>  }<a name="line.36"></a>
+<span class="sourceLineNo">037</span>}<a name="line.37"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.SnapshotFiles.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.SnapshotFiles.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.SnapshotFiles.html
index 778b581..e9e09f3 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.SnapshotFiles.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.SnapshotFiles.html
@@ -157,56 +157,58 @@
 <span class="sourceLineNo">149</span>    } catch (CorruptedSnapshotException cse) {<a name="line.149"></a>
 <span class="sourceLineNo">150</span>      LOG.info("Expected exception " + cse);<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    } finally {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir), true);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * If there is a corrupted data manifest, it should throw out CorruptedSnapshotException,<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * instead of an IOException<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   */<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  @Test<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  public void testCorruptedDataManifest() throws IOException {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    SnapshotTestingUtils.SnapshotMock<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    builder.addRegionV2();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // consolidate to generate a data.manifest file<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    builder.consolidate();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    builder.corruptDataManifest();<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    long period = Long.MAX_VALUE;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    try {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      cache.getSnapshotsInProgress(null);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    } catch (CorruptedSnapshotException cse) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      LOG.info("Expected exception " + cse);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    } finally {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir), true);<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><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  * HBASE-16464<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Test<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public void testMissedTmpSnapshot() throws IOException {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    SnapshotTestingUtils.SnapshotMock<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    builder.addRegionV2();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    builder.missOneRegionSnapshotFile();<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>      long period = Long.MAX_VALUE;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    cache.getSnapshotsInProgress(null);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertFalse(fs.exists(builder.getSnapshotsDir()));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>}<a name="line.201"></a>
+<span class="sourceLineNo">152</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir,<a name="line.152"></a>
+<span class="sourceLineNo">153</span>          TEST_UTIL.getConfiguration()), true);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  /**<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * If there is a corrupted data manifest, it should throw out CorruptedSnapshotException,<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * instead of an IOException<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Test<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public void testCorruptedDataManifest() throws IOException {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    SnapshotTestingUtils.SnapshotMock<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    builder.addRegionV2();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    // consolidate to generate a data.manifest file<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    builder.consolidate();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    builder.corruptDataManifest();<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    long period = Long.MAX_VALUE;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    try {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      cache.getSnapshotsInProgress(null);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    } catch (CorruptedSnapshotException cse) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info("Expected exception " + cse);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    } finally {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir,<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          TEST_UTIL.getConfiguration()), true);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  * HBASE-16464<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  @Test<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  public void testMissedTmpSnapshot() throws IOException {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    SnapshotTestingUtils.SnapshotMock<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    builder.addRegionV2();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    builder.missOneRegionSnapshotFile();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>      long period = Long.MAX_VALUE;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    cache.getSnapshotsInProgress(null);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    assertFalse(fs.exists(builder.getSnapshotsDir()));<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>}<a name="line.203"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
index 778b581..e9e09f3 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.html
@@ -157,56 +157,58 @@
 <span class="sourceLineNo">149</span>    } catch (CorruptedSnapshotException cse) {<a name="line.149"></a>
 <span class="sourceLineNo">150</span>      LOG.info("Expected exception " + cse);<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    } finally {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir), true);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * If there is a corrupted data manifest, it should throw out CorruptedSnapshotException,<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * instead of an IOException<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   */<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  @Test<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  public void testCorruptedDataManifest() throws IOException {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    SnapshotTestingUtils.SnapshotMock<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    builder.addRegionV2();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    // consolidate to generate a data.manifest file<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    builder.consolidate();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    builder.corruptDataManifest();<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    long period = Long.MAX_VALUE;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    try {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      cache.getSnapshotsInProgress(null);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    } catch (CorruptedSnapshotException cse) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      LOG.info("Expected exception " + cse);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    } finally {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir), true);<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><a name="line.182"></a>
-<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  * HBASE-16464<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Test<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public void testMissedTmpSnapshot() throws IOException {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    SnapshotTestingUtils.SnapshotMock<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    builder.addRegionV2();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    builder.missOneRegionSnapshotFile();<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>      long period = Long.MAX_VALUE;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    cache.getSnapshotsInProgress(null);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertFalse(fs.exists(builder.getSnapshotsDir()));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>}<a name="line.201"></a>
+<span class="sourceLineNo">152</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir,<a name="line.152"></a>
+<span class="sourceLineNo">153</span>          TEST_UTIL.getConfiguration()), true);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    }<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  /**<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * If there is a corrupted data manifest, it should throw out CorruptedSnapshotException,<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * instead of an IOException<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Test<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public void testCorruptedDataManifest() throws IOException {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    SnapshotTestingUtils.SnapshotMock<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    builder.addRegionV2();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    // consolidate to generate a data.manifest file<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    builder.consolidate();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    builder.corruptDataManifest();<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>    long period = Long.MAX_VALUE;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    try {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      cache.getSnapshotsInProgress(null);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    } catch (CorruptedSnapshotException cse) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      LOG.info("Expected exception " + cse);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    } finally {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      fs.delete(SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir,<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          TEST_UTIL.getConfiguration()), true);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  * HBASE-16464<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  @Test<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  public void testMissedTmpSnapshot() throws IOException {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    SnapshotTestingUtils.SnapshotMock<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        snapshotMock = new SnapshotTestingUtils.SnapshotMock(TEST_UTIL.getConfiguration(), fs, rootDir);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    SnapshotTestingUtils.SnapshotMock.SnapshotBuilder builder = snapshotMock.createSnapshotV2(<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        SNAPSHOT_NAME_STR, TABLE_NAME_STR);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    builder.addRegionV2();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    builder.missOneRegionSnapshotFile();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>      long period = Long.MAX_VALUE;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    cache.getSnapshotsInProgress(null);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    assertFalse(fs.exists(builder.getSnapshotsDir()));<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>}<a name="line.203"></a>
 
 
 


[04/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
index 826bcba..5323511 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.html
@@ -98,580 +98,623 @@
 <span class="sourceLineNo">090</span>  private static final String CFB = "b";<a name="line.90"></a>
 <span class="sourceLineNo">091</span>  private static final String COLUMN_1 = CFA + ":1";<a name="line.91"></a>
 <span class="sourceLineNo">092</span>  private static final String COLUMN_2 = CFB + ":2";<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static Client client;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static int expectedRows1;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static int expectedRows2;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static Configuration conf;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    new HBaseRESTTestingUtility();<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @BeforeClass<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public static void setUpBeforeClass() throws Exception {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    conf = TEST_UTIL.getConfiguration();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    TEST_UTIL.startMiniCluster();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    client = new Client(new Cluster().add("localhost",<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      REST_TEST_UTIL.getServletPort()));<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    if (!admin.tableExists(TABLE)) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    htd.addFamily(new HColumnDescriptor(CFA));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htd.addFamily(new HColumnDescriptor(CFB));<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    admin.createTable(htd);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<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>  @AfterClass<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public static void tearDownAfterClass() throws Exception {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    // Test scanning particular columns<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    StringBuilder builder = new StringBuilder();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    builder.append("/*");<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    builder.append("?");<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    builder.append("&amp;");<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      Constants.MIMETYPE_XML);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    assertEquals(200, response.getCode());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    int count = TestScannerResource.countCellSet(model);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    assertEquals(10, count);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    checkRowsNotNull(model);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>    //Test with no limit.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    builder = new StringBuilder();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    builder.append("/*");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    builder.append("?");<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      Constants.MIMETYPE_XML);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    assertEquals(200, response.getCode());<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    count = TestScannerResource.countCellSet(model);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(expectedRows1, count);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    checkRowsNotNull(model);<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    //Test with start and end row.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    builder = new StringBuilder();<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    builder.append("/*");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    builder.append("?");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    builder.append("&amp;");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    builder.append("&amp;");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Constants.MIMETYPE_XML);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    assertEquals(200, response.getCode());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    count = TestScannerResource.countCellSet(model);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    RowModel startRow = model.getRows().get(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    assertEquals(24, count);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    checkRowsNotNull(model);<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    //Test with start row and limit.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    builder = new StringBuilder();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    builder.append("/*");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    builder.append("?");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    builder.append("&amp;");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    builder.append("&amp;");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      Constants.MIMETYPE_XML);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    assertEquals(200, response.getCode());<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    startRow = model.getRows().get(0);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    count = TestScannerResource.countCellSet(model);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    assertEquals(15, count);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    checkRowsNotNull(model);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    // Test scanning particular columns with limit.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    StringBuilder builder = new StringBuilder();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    builder.append("/*");<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    builder.append("?");<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    builder.append("&amp;");<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      Constants.MIMETYPE_JSON);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    assertEquals(200, response.getCode());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    int count = TestScannerResource.countCellSet(model);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    assertEquals(2, count);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    checkRowsNotNull(model);<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    //Test scanning with no limit.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    builder = new StringBuilder();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    builder.append("/*");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    builder.append("?");<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      Constants.MIMETYPE_JSON);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    assertEquals(200, response.getCode());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    count = TestScannerResource.countCellSet(model);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    assertEquals(expectedRows2, count);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    checkRowsNotNull(model);<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    //Test with start row and end row.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    builder = new StringBuilder();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    builder.append("/*");<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    builder.append("?");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    builder.append("&amp;");<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    builder.append("&amp;");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      Constants.MIMETYPE_JSON);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    assertEquals(200, response.getCode());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    RowModel startRow = model.getRows().get(0);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    count = TestScannerResource.countCellSet(model);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertEquals(24, count);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    checkRowsNotNull(model);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * @throws Exception the exception<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  @Test<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    StringBuilder builder = new StringBuilder();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    builder.append("/*");<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    builder.append("?");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    builder.append("&amp;");<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      Constants.MIMETYPE_XML);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    assertEquals(200, response.getCode());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      CellModel.class);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        assertTrue(row.getKey() != null);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    };<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    });<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // create a new XML parser<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    factory.setNamespaceAware(true);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    reader.parse(new InputSource(response.getStream()));<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  @Test<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public void testStreamingJSON() throws Exception {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    //Test with start row and end row.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    StringBuilder builder = new StringBuilder();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    builder.append("/*");<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    builder.append("?");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    builder.append("&amp;");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    builder.append("&amp;");<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      Constants.MIMETYPE_JSON);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    assertEquals(200, response.getCode());<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    int count = 0;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean found = false;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        assertNotNull(row.getKey());<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          if (count == 0) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          if (count == 23) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.347"></a>
+<span class="sourceLineNo">093</span>  private static final String COLUMN_EMPTY = CFA + ":";<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static Client client;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static int expectedRows1;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private static int expectedRows2;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private static int expectedRows3;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static Configuration conf;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    new HBaseRESTTestingUtility();<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @BeforeClass<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static void setUpBeforeClass() throws Exception {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    conf = TEST_UTIL.getConfiguration();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    TEST_UTIL.startMiniCluster();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    client = new Client(new Cluster().add("localhost",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      REST_TEST_UTIL.getServletPort()));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    if (!admin.tableExists(TABLE)) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      htd.addFamily(new HColumnDescriptor(CFA));<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      htd.addFamily(new HColumnDescriptor(CFB));<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      admin.createTable(htd);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      expectedRows3 = TestScannerResource.insertData(conf, TABLE, COLUMN_EMPTY, 1.0);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @AfterClass<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static void tearDownAfterClass() throws Exception {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  @Test<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Test scanning particular columns<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    StringBuilder builder = new StringBuilder();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    builder.append("/*");<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    builder.append("?");<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    builder.append("&amp;");<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      Constants.MIMETYPE_XML);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    assertEquals(200, response.getCode());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    int count = TestScannerResource.countCellSet(model);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    assertEquals(10, count);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    checkRowsNotNull(model);<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    //Test with no limit.<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    builder = new StringBuilder();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    builder.append("/*");<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    builder.append("?");<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      Constants.MIMETYPE_XML);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertEquals(200, response.getCode());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    count = TestScannerResource.countCellSet(model);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    assertEquals(expectedRows1, count);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    checkRowsNotNull(model);<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    //Test with start and end row.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    builder = new StringBuilder();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    builder.append("/*");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    builder.append("?");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    builder.append("&amp;");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    builder.append("&amp;");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      Constants.MIMETYPE_XML);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    assertEquals(200, response.getCode());<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    count = TestScannerResource.countCellSet(model);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    RowModel startRow = model.getRows().get(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertEquals(24, count);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    checkRowsNotNull(model);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    //Test with start row and limit.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    builder = new StringBuilder();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    builder.append("/*");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    builder.append("?");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    builder.append("&amp;");<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    builder.append("&amp;");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      Constants.MIMETYPE_XML);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    assertEquals(200, response.getCode());<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    startRow = model.getRows().get(0);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    count = TestScannerResource.countCellSet(model);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    assertEquals(15, count);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    checkRowsNotNull(model);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @Test<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Test scanning particular columns with limit.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    StringBuilder builder = new StringBuilder();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    builder.append("/*");<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    builder.append("?");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    builder.append("&amp;");<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      Constants.MIMETYPE_JSON);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    assertEquals(200, response.getCode());<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    int count = TestScannerResource.countCellSet(model);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    assertEquals(2, count);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    checkRowsNotNull(model);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>    //Test scanning with no limit.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    builder = new StringBuilder();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    builder.append("/*");<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    builder.append("?");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      Constants.MIMETYPE_JSON);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    assertEquals(200, response.getCode());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    count = TestScannerResource.countCellSet(model);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    assertEquals(expectedRows2, count);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    checkRowsNotNull(model);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    //Test with start row and end row.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    builder = new StringBuilder();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    builder.append("/*");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    builder.append("?");<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    builder.append("&amp;");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    builder.append("&amp;");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      Constants.MIMETYPE_JSON);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    assertEquals(200, response.getCode());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    RowModel startRow = model.getRows().get(0);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    count = TestScannerResource.countCellSet(model);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    assertEquals(24, count);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    checkRowsNotNull(model);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>  /**<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @throws Exception the exception<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    StringBuilder builder = new StringBuilder();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    builder.append("/*");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    builder.append("?");<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    builder.append("&amp;");<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      Constants.MIMETYPE_XML);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(200, response.getCode());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      CellModel.class);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        assertTrue(row.getKey() != null);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    };<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        @Override<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<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>        @Override<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<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>    });<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // create a new XML parser<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    factory.setNamespaceAware(true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    reader.parse(new InputSource(response.getStream()));<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<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><a name="line.319"></a>
+<span class="sourceLineNo">320</span>  @Test<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  public void testStreamingJSON() throws Exception {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    //Test with start row and end row.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    StringBuilder builder = new StringBuilder();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    builder.append("/*");<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    builder.append("?");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    builder.append("&amp;");<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    builder.append("&amp;");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      Constants.MIMETYPE_JSON);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(200, response.getCode());<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    int count = 0;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean found = false;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        assertNotNull(row.getKey());<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          if (count == 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.347"></a>
 <span class="sourceLineNo">348</span>          }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          count++;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        jParser.skipChildren();<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      } else {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    assertEquals(24, count);<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>  @Test<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    StringBuilder builder = new StringBuilder();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    builder.append("/*");<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    builder.append("?");<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    builder.append("&amp;");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    assertEquals(200, response.getCode());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    assertEquals(15, rowCount);<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>    //Test with start row and end row.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    builder = new StringBuilder();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    builder.append("/*");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    builder.append("?");<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    builder.append("&amp;");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    builder.append("&amp;");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    assertEquals(200, response.getCode());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    rowCount = readProtobufStream(response.getStream());<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    assertEquals(24, rowCount);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private void checkRowsNotNull(CellSetModel model) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    for (RowModel row: model.getRows()) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      assertTrue(row.getKey() != null);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    }<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>   * Read protobuf stream.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * @param inputStream the input stream<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @return The number of rows in the cell set model.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    CellSetModel model = null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    int rowCount = 0;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    try {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      while (true) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        byte[] lengthBytes = new byte[2];<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        int readBytes = stream.read(lengthBytes);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        if (readBytes == -1) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          break;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        assertEquals(2, readBytes);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        int length = Bytes.toShort(lengthBytes);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        byte[] cellset = new byte[length];<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        stream.read(cellset);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        model = new CellSetModel();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        model.getObjectFromMessage(cellset);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        checkRowsNotNull(model);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    } catch (EOFException exp) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      exp.printStackTrace();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    } finally {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      stream.close();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return rowCount;<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>  @Test<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    // Test scanning particular columns with limit.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    StringBuilder builder = new StringBuilder();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    builder.append("/*");<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    builder.append("?");<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      Constants.MIMETYPE_JSON);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    assertEquals(200, response.getCode());<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    int count = TestScannerResource.countCellSet(model);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    assertEquals(0, count);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>  @Test<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public void testSimpleFilter() throws IOException, JAXBException {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    StringBuilder builder = new StringBuilder();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    builder.append("/*");<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    builder.append("?");<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    builder.append("&amp;");<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    builder.append("&amp;");<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    builder.append("&amp;");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("PrefixFilter('aab')", "UTF-8"));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    Response response =<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(200, response.getCode());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    int count = TestScannerResource.countCellSet(model);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    assertEquals(1, count);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    assertEquals("aab",<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testQualifierAndPrefixFilters() throws IOException, JAXBException {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    StringBuilder builder = new StringBuilder();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    builder.append("/abc*");<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    builder.append("?");<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + URLEncoder.encode("QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    Response response =<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    assertEquals(200, response.getCode());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    int count = TestScannerResource.countCellSet(model);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    assertEquals(1, count);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    assertEquals("abc",<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  @Test<a name="line.493"></a>
-<span class="sourceLineNo">494</span>  public void testCompoundFilter() throws IOException, JAXBException {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    StringBuilder builder = new StringBuilder();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    builder.append("/*");<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    builder.append("?");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        + URLEncoder.encode("PrefixFilter('abc') AND QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    Response response =<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    assertEquals(200, response.getCode());<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    int count = TestScannerResource.countCellSet(model);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assertEquals(1, count);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    assertEquals("abc",<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>  @Test<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  public void testCustomFilter() throws IOException, JAXBException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    StringBuilder builder = new StringBuilder();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    builder.append("/a*");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    builder.append("?");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    builder.append("&amp;");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    Response response =<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertEquals(200, response.getCode());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    int count = TestScannerResource.countCellSet(model);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    assertEquals(1, count);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    assertEquals("abc",<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  @Test<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public void testNegativeCustomFilter() throws IOException, JAXBException {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    StringBuilder builder = new StringBuilder();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    builder.append("/b*");<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    builder.append("?");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    builder.append("&amp;");<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    Response response =<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    assertEquals(200, response.getCode());<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    int count = TestScannerResource.countCellSet(model);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Should return no rows as the filters conflict<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    assertEquals(0, count);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  @Test<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  public void testReversed() throws IOException, JAXBException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    StringBuilder builder = new StringBuilder();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    builder.append("/*");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    builder.append("?");<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    builder.append("&amp;");<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    builder.append("&amp;");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Response response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    assertEquals(200, response.getCode());<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    int count = TestScannerResource.countCellSet(model);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    assertEquals(24, count);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    List&lt;RowModel&gt; rowModels = model.getRows().subList(1, count);<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    //reversed<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    builder = new StringBuilder();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    builder.append("/*");<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    builder.append("?");<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    builder.append("&amp;");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    builder.append(Constants.SCAN_START_ROW + "=aay");<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    builder.append("&amp;");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    builder.append(Constants.SCAN_END_ROW + "=aaa");<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    builder.append("&amp;");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    builder.append(Constants.SCAN_REVERSED + "=true");<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    assertEquals(200, response.getCode());<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    count = TestScannerResource.countCellSet(model);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    assertEquals(24, count);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    List&lt;RowModel&gt; reversedRowModels = model.getRows().subList(1, count);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    Collections.reverse(reversedRowModels);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    assertEquals(rowModels.size(), reversedRowModels.size());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    for (int i = 0; i &lt; rowModels.size(); i++) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      RowModel rowModel = rowModels.get(i);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      RowModel reversedRowModel = reversedRowModels.get(i);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>      assertEquals(new String(rowModel.getKey(), "UTF-8"),<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          new String(reversedRowModel.getKey(), "UTF-8"));<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      assertEquals(new String(rowModel.getCells().get(0).getValue(), "UTF-8"),<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          new String(reversedRowModel.getCells().get(0).getValue(), "UTF-8"));<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>  public static class CustomFilter extends PrefixFilter {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    private byte[] key = null;<a name="line.602"></a>
+<span class="sourceLineNo">349</span>          if (count == 23) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>          count++;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        jParser.skipChildren();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      } else {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<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>    assertEquals(24, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Test<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    StringBuilder builder = new StringBuilder();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    builder.append("/*");<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    builder.append("?");<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    builder.append("&amp;");<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    assertEquals(200, response.getCode());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    assertEquals(15, rowCount);<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    //Test with start row and end row.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    builder = new StringBuilder();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    builder.append("/*");<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    builder.append("?");<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    builder.append("&amp;");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    builder.append("&amp;");<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    assertEquals(200, response.getCode());<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    rowCount = readProtobufStream(response.getStream());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    assertEquals(24, rowCount);<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>  private void checkRowsNotNull(CellSetModel model) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    for (RowModel row: model.getRows()) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      assertTrue(row.getKey() != null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * Read protobuf stream.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   * @param inputStream the input stream<a name="line.403"></a>
+<span class="sourceLineNo">404</span>   * @return The number of rows in the cell set model.<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   */<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    CellSetModel model = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    int rowCount = 0;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      while (true) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        byte[] lengthBytes = new byte[2];<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        int readBytes = stream.read(lengthBytes);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        if (readBytes == -1) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          break;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        assertEquals(2, readBytes);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        int length = Bytes.toShort(lengthBytes);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        byte[] cellset = new byte[length];<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        stream.read(cellset);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        model = new CellSetModel();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        model.getObjectFromMessage(cellset);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        checkRowsNotNull(model);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    } catch (EOFException exp) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      exp.printStackTrace();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      stream.close();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return rowCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  @Test<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // Test scanning particular columns with limit.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    StringBuilder builder = new StringBuilder();<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    builder.append("/*");<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    builder.append("?");<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Constants.MIMETYPE_JSON);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    assertEquals(200, response.getCode());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    int count = TestScannerResource.countCellSet(model);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    assertEquals(0, count);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453<

<TRUNCATED>

[26/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
index 7462d5b..63a00a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
@@ -122,294 +122,339 @@
 <span class="sourceLineNo">114</span>  /** Temporary directory under the snapshot directory to store in-progress snapshots */<a name="line.114"></a>
 <span class="sourceLineNo">115</span>  public static final String SNAPSHOT_TMP_DIR_NAME = ".tmp";<a name="line.115"></a>
 <span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  /** This tag will be created in in-progess snapshots */<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  public static final String SNAPSHOT_IN_PROGRESS = ".inprogress";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  // snapshot operation values<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  /** Default value if no start time is specified */<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  public static final long NO_SNAPSHOT_START_TIME_SPECIFIED = 0;<a name="line.121"></a>
+<span class="sourceLineNo">117</span>  /**<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * The configuration property that determines the filepath of the snapshot<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * base working directory<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public static final String SNAPSHOT_WORKING_DIR = "hbase.snapshot.working.dir";<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 static final String MASTER_SNAPSHOT_TIMEOUT_MILLIS = "hbase.snapshot.master.timeout.millis";<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  /** By default, wait 300 seconds for a snapshot to complete */<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public static final long DEFAULT_MAX_WAIT_TIME = 60000 * 5 ;<a name="line.127"></a>
+<span class="sourceLineNo">123</span>  /** This tag will be created in in-progess snapshots */<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  public static final String SNAPSHOT_IN_PROGRESS = ".inprogress";<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  // snapshot operation values<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  /** Default value if no start time is specified */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static final long NO_SNAPSHOT_START_TIME_SPECIFIED = 0;<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * By default, check to see if the snapshot is complete (ms)<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @deprecated Use {@link #DEFAULT_MAX_WAIT_TIME} instead.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Deprecated<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static final int SNAPSHOT_TIMEOUT_MILLIS_DEFAULT = 60000 * 5;<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  /**<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * Conf key for # of ms elapsed before injecting a snapshot timeout error when waiting for<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * completion.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * @deprecated Use {@link #MASTER_SNAPSHOT_TIMEOUT_MILLIS} instead.<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  @Deprecated<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final String SNAPSHOT_TIMEOUT_MILLIS_KEY = "hbase.snapshot.master.timeoutMillis";<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  private SnapshotDescriptionUtils() {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    // private constructor for utility class<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>  /**<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param conf {@link Configuration} from which to check for the timeout<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @param type type of snapshot being taken<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * @param defaultMaxWaitTime Default amount of time to wait, if none is in the configuration<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * @return the max amount of time the master should wait for a snapshot to complete<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  public static long getMaxMasterTimeout(Configuration conf, SnapshotDescription.Type type,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      long defaultMaxWaitTime) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    String confKey;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    switch (type) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    case DISABLED:<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    default:<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      confKey = MASTER_SNAPSHOT_TIMEOUT_MILLIS;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    }<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    return Math.max(conf.getLong(confKey, defaultMaxWaitTime),<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        conf.getLong(SNAPSHOT_TIMEOUT_MILLIS_KEY, defaultMaxWaitTime));<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * Get the snapshot root directory. All the snapshots are kept under this directory, i.e.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * ${hbase.rootdir}/.snapshot<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param rootDir hbase root directory<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * @return the base directory in which all snapshots are kept<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public static Path getSnapshotRootDir(final Path rootDir) {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  /**<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * Get the directory for a specified snapshot. This directory is a sub-directory of snapshot root<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param snapshot snapshot being taken<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * @param rootDir hbase root directory<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * @return the final directory for the completed snapshot<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  public static Path getCompletedSnapshotDir(final SnapshotDescription snapshot, final Path rootDir) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    return getCompletedSnapshotDir(snapshot.getName(), rootDir);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * Get the directory for a completed snapshot. This directory is a sub-directory of snapshot root<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param snapshotName name of the snapshot being taken<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @param rootDir hbase root directory<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @return the final directory for the completed snapshot<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  public static Path getCompletedSnapshotDir(final String snapshotName, final Path rootDir) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    return getCompletedSnapshotDir(getSnapshotsDir(rootDir), snapshotName);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  }<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">200</span>   * Get the general working directory for snapshots - where they are built, where they are<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * temporarily copied on export, etc.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @param rootDir root directory of the HBase installation<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @return Path to the snapshot tmp directory, relative to the passed root directory<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public static Path getWorkingSnapshotDir(final Path rootDir) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    return new Path(getSnapshotsDir(rootDir), SNAPSHOT_TMP_DIR_NAME);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * @param snapshot snapshot that will be built<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param rootDir root directory of the hbase installation<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @return {@link Path} where one can build a snapshot<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  public static Path getWorkingSnapshotDir(SnapshotDescription snapshot, final Path rootDir) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    return getCompletedSnapshotDir(getWorkingSnapshotDir(rootDir), snapshot.getName());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /**<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * @param snapshotName name of the snapshot<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @param rootDir root directory of the hbase installation<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   * @return {@link Path} where one can build a snapshot<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   */<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public static Path getWorkingSnapshotDir(String snapshotName, final Path rootDir) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    return getCompletedSnapshotDir(getWorkingSnapshotDir(rootDir), snapshotName);<a name="line.226"></a>
+<span class="sourceLineNo">130</span>  public static final String MASTER_SNAPSHOT_TIMEOUT_MILLIS = "hbase.snapshot.master.timeout.millis";<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  /** By default, wait 300 seconds for a snapshot to complete */<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public static final long DEFAULT_MAX_WAIT_TIME = 60000 * 5 ;<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">137</span>   * By default, check to see if the snapshot is complete (ms)<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * @deprecated Use {@link #DEFAULT_MAX_WAIT_TIME} instead.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  @Deprecated<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final int SNAPSHOT_TIMEOUT_MILLIS_DEFAULT = 60000 * 5;<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>   * Conf key for # of ms elapsed before injecting a snapshot timeout error when waiting for<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * completion.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @deprecated Use {@link #MASTER_SNAPSHOT_TIMEOUT_MILLIS} instead.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  @Deprecated<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public static final String SNAPSHOT_TIMEOUT_MILLIS_KEY = "hbase.snapshot.master.timeoutMillis";<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private SnapshotDescriptionUtils() {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    // private constructor for utility class<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  }<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  /**<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param conf {@link Configuration} from which to check for the timeout<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param type type of snapshot being taken<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @param defaultMaxWaitTime Default amount of time to wait, if none is in the configuration<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @return the max amount of time the master should wait for a snapshot to complete<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  public static long getMaxMasterTimeout(Configuration conf, SnapshotDescription.Type type,<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      long defaultMaxWaitTime) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    String confKey;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    switch (type) {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    case DISABLED:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    default:<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      confKey = MASTER_SNAPSHOT_TIMEOUT_MILLIS;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return Math.max(conf.getLong(confKey, defaultMaxWaitTime),<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        conf.getLong(SNAPSHOT_TIMEOUT_MILLIS_KEY, defaultMaxWaitTime));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
+<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">173</span>  /**<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * Get the snapshot root directory. All the snapshots are kept under this directory, i.e.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * ${hbase.rootdir}/.snapshot<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * @param rootDir hbase root directory<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * @return the base directory in which all snapshots are kept<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   */<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public static Path getSnapshotRootDir(final Path rootDir) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * Get the directory for a specified snapshot. This directory is a sub-directory of snapshot root<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @param snapshot snapshot being taken<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * @param rootDir hbase root directory<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * @return the final directory for the completed snapshot<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   */<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  public static Path getCompletedSnapshotDir(final SnapshotDescription snapshot, final Path rootDir) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    return getCompletedSnapshotDir(snapshot.getName(), rootDir);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  /**<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * Get the directory for a completed snapshot. This directory is a sub-directory of snapshot root<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * directory and all the data files for a snapshot are kept under this directory.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param snapshotName name of the snapshot being taken<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param rootDir hbase root directory<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @return the final directory for the completed snapshot<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  public static Path getCompletedSnapshotDir(final String snapshotName, final Path rootDir) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    return getSpecifiedSnapshotDir(getSnapshotsDir(rootDir), snapshotName);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /**<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * Get the general working directory for snapshots - where they are built, where they are<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * temporarily copied on export, etc.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * @param rootDir root directory of the HBase installation<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param conf Configuration of the HBase instance<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * @return Path to the snapshot tmp directory, relative to the passed root directory<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  public static Path getWorkingSnapshotDir(final Path rootDir, final Configuration conf) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    return new Path(conf.get(SNAPSHOT_WORKING_DIR,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        getDefaultWorkingSnapshotDir(rootDir).toString()));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @param snapshot snapshot that will be built<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   * @param rootDir root directory of the hbase installation<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * @param conf Configuration of the HBase instance<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * @return {@link Path} where one can build a snapshot<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  public static Path getWorkingSnapshotDir(SnapshotDescription snapshot, final Path rootDir,<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      Configuration conf) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    return getWorkingSnapshotDir(snapshot.getName(), rootDir, conf);<a name="line.226"></a>
 <span class="sourceLineNo">227</span>  }<a name="line.227"></a>
 <span class="sourceLineNo">228</span><a name="line.228"></a>
 <span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Get the directory to store the snapshot instance<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param snapshotsDir hbase-global directory for storing all snapshots<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param snapshotName name of the snapshot to take<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @return the final directory for the completed snapshot<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  private static final Path getCompletedSnapshotDir(final Path snapshotsDir, String snapshotName) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    return new Path(snapshotsDir, snapshotName);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * @param rootDir hbase root directory<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * @return the directory for all completed snapshots;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   */<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  public static final Path getSnapshotsDir(Path rootDir) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  }<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>   * Convert the passed snapshot description into a 'full' snapshot description based on default<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * parameters, if none have been supplied. This resolves any 'optional' parameters that aren't<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * supplied to their default values.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @param snapshot general snapshot descriptor<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param conf Configuration to read configured snapshot defaults if snapshot is not complete<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @return a valid snapshot description<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @throws IllegalArgumentException if the {@link SnapshotDescription} is not a complete<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   *           {@link SnapshotDescription}.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   */<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  public static SnapshotDescription validate(SnapshotDescription snapshot, Configuration conf)<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      throws IllegalArgumentException, IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    if (!snapshot.hasTable()) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      throw new IllegalArgumentException(<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          "Descriptor doesn't apply to a table, so we can't build it.");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    // set the creation time, if one hasn't been set<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    long time = snapshot.getCreationTime();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    if (time == SnapshotDescriptionUtils.NO_SNAPSHOT_START_TIME_SPECIFIED) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      time = EnvironmentEdgeManager.currentTime();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      LOG.debug("Creation time not specified, setting to:" + time + " (current time:"<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          + EnvironmentEdgeManager.currentTime() + ").");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      SnapshotDescription.Builder builder = snapshot.toBuilder();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      builder.setCreationTime(time);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      snapshot = builder.build();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // set the acl to snapshot if security feature is enabled.<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    if (isSecurityAvailable(conf)) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      snapshot = writeAclToSnapshotDescription(snapshot, conf);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return snapshot;<a name="line.279"></a>
+<span class="sourceLineNo">230</span>   * Get the directory to build a snapshot, before it is finalized<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @param snapshotName name of the snapshot<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * @param rootDir root directory of the hbase installation<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param conf Configuration of the HBase instance<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @return {@link Path} where one can build a snapshot<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public static Path getWorkingSnapshotDir(String snapshotName, final Path rootDir,<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      Configuration conf) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    return getSpecifiedSnapshotDir(getWorkingSnapshotDir(rootDir, conf), snapshotName);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * Get the directory within the given filepath to store the snapshot instance<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param snapshotsDir directory to store snapshot directory within<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * @param snapshotName name of the snapshot to take<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @return the final directory for the snapshot in the given filepath<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  private static final Path getSpecifiedSnapshotDir(final Path snapshotsDir, String snapshotName) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    return new Path(snapshotsDir, snapshotName);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * @param rootDir hbase root directory<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * @return the directory for all completed snapshots;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  public static final Path getSnapshotsDir(Path rootDir) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    return new Path(rootDir, HConstants.SNAPSHOT_DIR_NAME);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
+<span class="sourceLineNo">258</span><a name="line.258"></a>
+<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * Determines if the given workingDir is a subdirectory of the given "root directory"<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * @param workingDir a directory to check<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * @param rootDir root directory of the HBase installation<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * @return true if the given workingDir is a subdirectory of the given root directory,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   *   false otherwise<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static boolean isSubDirectoryOf(final Path workingDir, final Path rootDir) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return workingDir.toString().startsWith(rootDir.toString() + Path.SEPARATOR);<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>   * Determines if the given workingDir is a subdirectory of the default working snapshot directory<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * @param workingDir a directory to check<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param conf configuration for the HBase cluster<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @return true if the given workingDir is a subdirectory of the default working directory for<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   *   snapshots, false otherwise<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public static boolean isWithinDefaultWorkingDir(final Path workingDir, Configuration conf) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Path defaultWorkingDir = getDefaultWorkingSnapshotDir(new Path(conf.get(HConstants.HBASE_DIR)));<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return workingDir.equals(defaultWorkingDir) || isSubDirectoryOf(workingDir, defaultWorkingDir);<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Write the snapshot description into the working directory of a snapshot<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param snapshot description of the snapshot being taken<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * @param workingDir working directory of the snapshot<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   * @param fs {@link FileSystem} on which the snapshot should be taken<a name="line.286"></a>
-<span class="sourceLineNo">287</span>   * @throws IOException if we can't reach the filesystem and the file cannot be cleaned up on<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   *           failure<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   */<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public static void writeSnapshotInfo(SnapshotDescription snapshot, Path workingDir, FileSystem fs)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      throws IOException {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    Path snapshotInfo = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOTINFO_FILE);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    try {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      FSDataOutputStream out = FSUtils.create(fs, snapshotInfo, perms, true);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      try {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        snapshot.writeTo(out);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      } finally {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        out.close();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    } catch (IOException e) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      // if we get an exception, try to remove the snapshot info<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      if (!fs.delete(snapshotInfo, false)) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        String msg = "Couldn't delete snapshot info file: " + snapshotInfo;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        LOG.error(msg);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        throw new IOException(msg);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * Create in-progress tag under .tmp of in-progress snapshot<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public static void createInProgressTag(Path workingDir, FileSystem fs) throws IOException {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    Path snapshot_in_progress = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOT_IN_PROGRESS);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    FSUtils.create(fs, snapshot_in_progress, perms, true);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  /**<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * Read in the {@link org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription} stored for the snapshot in the passed directory<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * @param fs filesystem where the snapshot was taken<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * @param snapshotDir directory where the snapshot was stored<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * @return the stored snapshot description<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * @throws CorruptedSnapshotException if the<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * snapshot cannot be read<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public static SnapshotDescription readSnapshotInfo(FileSystem fs, Path snapshotDir)<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      throws CorruptedSnapshotException {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    Path snapshotInfo = new Path(snapshotDir, SNAPSHOTINFO_FILE);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    try {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      FSDataInputStream in = null;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      try {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        in = fs.open(snapshotInfo);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        SnapshotDescription desc = SnapshotDescription.parseFrom(in);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        return desc;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      } finally {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        if (in != null) in.close();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    } catch (IOException e) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      throw new CorruptedSnapshotException("Couldn't read snapshot info from:" + snapshotInfo, e);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Move the finished snapshot to its final, publicly visible directory - this marks the snapshot<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * as 'complete'.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @param snapshot description of the snapshot being tabken<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param rootdir root directory of the hbase installation<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param workingDir directory where the in progress snapshot was built<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param fs {@link FileSystem} where the snapshot was built<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @throws org.apache.hadoop.hbase.snapshot.SnapshotCreationException if the<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * snapshot could not be moved<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @throws IOException the filesystem could not be reached<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  public static void completeSnapshot(SnapshotDescription snapshot, Path rootdir, Path workingDir,<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      FileSystem fs) throws SnapshotCreationException, IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    Path finishedDir = getCompletedSnapshotDir(snapshot, rootdir);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    LOG.debug("Snapshot is done, just moving the snapshot from " + workingDir + " to "<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        + finishedDir);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    if (!fs.rename(workingDir, finishedDir)) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      throw new SnapshotCreationException(<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          "Failed to move working directory(" + workingDir + ") to completed directory("<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              + finishedDir + ").", ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /**<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * Check if the user is this table snapshot's owner<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * @param snapshot the table snapshot description<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * @param user the user<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @return true if the user is the owner of the snapshot,<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   *         false otherwise or the snapshot owner field is not present.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public static boolean isSnapshotOwner(org.apache.hadoop.hbase.client.SnapshotDescription snapshot,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      User user) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    if (user == null) return false;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    return user.getShortName().equals(snapshot.getOwner());<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  public static boolean isSecurityAvailable(Configuration conf) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    try (Connection conn = ConnectionFactory.createConnection(conf)) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      try (Admin admin = conn.getAdmin()) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        return admin.tableExists(AccessControlLists.ACL_TABLE_NAME);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private static SnapshotDescription writeAclToSnapshotDescription(SnapshotDescription snapshot,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      Configuration conf) throws IOException {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    ListMultimap&lt;String, TablePermission&gt; perms =<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        User.runAsLoginUser(new PrivilegedExceptionAction&lt;ListMultimap&lt;String, TablePermission&gt;&gt;() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          @Override<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          public ListMultimap&lt;String, TablePermission&gt; run() throws Exception {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            return AccessControlLists.getTablePermissions(conf,<a name="line.397"></a>
-<span class="sourceLineNo">398</span>              TableName.valueOf(snapshot.getTable()));<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        });<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    return snapshot.toBuilder()<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .setUsersAndPermissions(ShadedAccessControlUtil.toUserTablePermissions(perms)).build();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>}<a name="line.404"></a>
+<span class="sourceLineNo">283</span>   * Get the default working directory for snapshots - where they are built, where they are<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   * temporarily copied on export, etc.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>   * @param rootDir root directory of the HBase installation<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @return Path to the default snapshot tmp directory, relative to the passed root directory<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   */<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  private static Path getDefaultWorkingSnapshotDir(final Path rootDir) {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    return new Path(getSnapshotsDir(rootDir), SNAPSHOT_TMP_DIR_NAME);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>  /**<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * Convert the passed snapshot description into a 'full' snapshot description based on default<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * parameters, if none have been supplied. This resolves any 'optional' parameters that aren't<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * supplied to their default values.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * @param snapshot general snapshot descriptor<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @param conf Configuration to read configured snapshot defaults if snapshot is not complete<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @return a valid snapshot description<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   * @throws IllegalArgumentException if the {@link SnapshotDescription} is not a complete<a name="line.299"></a>
+<span class="sourceLineNo">300</span>   *           {@link SnapshotDescription}.<a name="line.300"></a>
+<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public static SnapshotDescription validate(SnapshotDescription snapshot, Configuration conf)<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      throws IllegalArgumentException, IOException {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (!snapshot.hasTable()) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      throw new IllegalArgumentException(<a name="line.305"></a>
+<span class="sourceLineNo">306</span>          "Descriptor doesn't apply to a table, so we can't build it.");<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // set the creation time, if one hasn't been set<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    long time = snapshot.getCreationTime();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (time == SnapshotDescriptionUtils.NO_SNAPSHOT_START_TIME_SPECIFIED) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      time = EnvironmentEdgeManager.currentTime();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      LOG.debug("Creation time not specified, setting to:" + time + " (current time:"<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          + EnvironmentEdgeManager.currentTime() + ").");<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      SnapshotDescription.Builder builder = snapshot.toBuilder();<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      builder.setCreationTime(time);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      snapshot = builder.build();<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>    // set the acl to snapshot if security feature is enabled.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    if (isSecurityAvailable(conf)) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      snapshot = writeAclToSnapshotDescription(snapshot, conf);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    return snapshot;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  }<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>   * Write the snapshot description into the working directory of a snapshot<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @param snapshot description of the snapshot being taken<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param workingDir working directory of the snapshot<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * @param fs {@link FileSystem} on which the snapshot should be taken<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * @throws IOException if we can't reach the filesystem and the file cannot be cleaned up on<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   *           failure<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public static void writeSnapshotInfo(SnapshotDescription snapshot, Path workingDir, FileSystem fs)<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      throws IOException {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    Path snapshotInfo = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOTINFO_FILE);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    try {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      FSDataOutputStream out = FSUtils.create(fs, snapshotInfo, perms, true);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        snapshot.writeTo(out);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      } finally {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        out.close();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      }<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    } catch (IOException e) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      // if we get an exception, try to remove the snapshot info<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      if (!fs.delete(snapshotInfo, false)) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        String msg = "Couldn't delete snapshot info file: " + snapshotInfo;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        LOG.error(msg);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        throw new IOException(msg);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<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>   * Create in-progress tag under .tmp of in-progress snapshot<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  public static void createInProgressTag(Path workingDir, FileSystem fs) throws IOException {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    FsPermission perms = FSUtils.getFilePermissions(fs, fs.getConf(),<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      HConstants.DATA_FILE_UMASK_KEY);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    Path snapshot_in_progress = new Path(workingDir, SnapshotDescriptionUtils.SNAPSHOT_IN_PROGRESS);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    FSUtils.create(fs, snapshot_in_progress, perms, true);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  }<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>   * Read in the {@link org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription} stored for the snapshot in the passed directory<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @param fs filesystem where the snapshot was taken<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * @param snapshotDir directory where the snapshot was stored<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * @return the stored snapshot description<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * @throws CorruptedSnapshotException if the<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * snapshot cannot be read<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public static SnapshotDescription readSnapshotInfo(FileSystem fs, Path snapshotDir)<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      throws CorruptedSnapshotException {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    Path snapshotInfo = new Path(snapshotDir, SNAPSHOTINFO_FILE);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    try {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      FSDataInputStream in = null;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      try {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        in = fs.open(snapshotInfo);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        SnapshotDescription desc = SnapshotDescription.parseFrom(in);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        return desc;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      } finally {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        if (in != null) in.close();<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>      throw new CorruptedSnapshotException("Couldn't read snapshot info from:" + snapshotInfo, e);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * Move the finished snapshot to its final, publicly visible directory - this marks the snapshot<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * as 'complete'.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param snapshot description of the snapshot being tabken<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @param rootdir root directory of the hbase installation<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * @param workingDir directory where the in progress snapshot was built<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @param fs {@link FileSystem} where the snapshot was built<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * @throws org.apache.hadoop.hbase.snapshot.SnapshotCreationException if the<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * snapshot could not be moved<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * @throws IOException the filesystem could not be reached<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   */<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  public static void completeSnapshot(SnapshotDescription snapshot, Path rootdir, Path workingDir,<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      FileSystem fs) throws SnapshotCreationException, IOException {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    Path finishedDir = getCompletedSnapshotDir(snapshot, rootdir);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    LOG.debug("Snapshot is done, just moving the snapshot from " + workingDir + " to "<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        + finishedDir);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    if (!fs.rename(workingDir, finishedDir)) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      throw new SnapshotCreationException(<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          "Failed to move working directory(" + workingDir + ") to completed directory("<a name="line.410"></a>
+<span class="sourceLineNo">411</span>              + finishedDir + ").", ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
+<span class="sourceLineNo">414</span><a name="line.414"></a>
+<span class="sourceLineNo">415</span>  /**<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * Check if the user is this table snapshot's owner<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * @param snapshot the table snapshot description<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * @param user the user<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * @return true if the user is the owner of the snapshot,<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   *         false otherwise or the snapshot owner field is not present.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   */<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  public static boolean isSnapshotOwner(org.apache.hadoop.hbase.client.SnapshotDescription snapshot,<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      User user) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    if (user == null) return false;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    return user.getShortName().equals(snapshot.getOwner());<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>  public static boolean isSecurityAvailable(Configuration conf) throws IOException {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    try (Connection conn = ConnectionFactory.createConnection(conf)) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      try (Admin admin = conn.getAdmin()) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        return admin.tableExists(AccessControlLists.ACL_TABLE_NAME);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private static SnapshotDescription writeAclToSnapshotDescription(SnapshotDescription snapshot,<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      Configuration conf) throws IOException {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    ListMultimap&lt;String, TablePermission&gt; perms =<a name="line.438"></a>
+<span class="sourceLineNo">439</span>        User.runAsLoginUser(new PrivilegedExceptionAction&lt;ListMultimap&lt;String, TablePermission&gt;&gt;() {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>          @Override<a name="line.440"></a>
+<span class="sourceLineNo">441</span>          public ListMultimap&lt;String, TablePermission&gt; run() throws Exception {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>            return AccessControlLists.getTablePermissions(conf,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>              TableName.valueOf(snapshot.getTable()));<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>    return snapshot.toBuilder()<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        .setUsersAndPermissions(ShadedAccessControlUtil.toUserTablePermissions(perms)).build();<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span>}<a name="line.449"></a>
 
 
 


[09/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  private final String f

<TRUNCATED>

[49/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.


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

Branch: refs/heads/asf-site
Commit: 705d69c414b36c9f727d82caa1315bed0ea76b07
Parents: 8ea88a7
Author: jenkins <bu...@apache.org>
Authored: Wed Sep 12 14:53:40 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Wed Sep 12 14:53:40 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                | 29812 +++++++++--------
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |     6 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |   340 +-
 book.html                                       |    17 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 15924 +++++----
 checkstyle.rss                                  |    64 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |    13 +-
 devapidocs/index-all.html                       |    68 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/client/package-tree.html       |    24 +-
 .../class-use/ForeignExceptionSnare.html        |     2 +-
 .../hadoop/hbase/executor/package-tree.html     |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |     8 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     4 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../hbase/master/class-use/MasterServices.html  |     4 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../snapshot/DisabledTableSnapshotHandler.html  |    16 +-
 .../snapshot/EnabledTableSnapshotHandler.html   |    11 +-
 .../master/snapshot/MasterSnapshotVerifier.html |    49 +-
 .../hbase/master/snapshot/SnapshotManager.html  |    70 +-
 .../master/snapshot/TakeSnapshotHandler.html    |   136 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    16 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../store/wal/WALProcedureStore.PushType.html   |     8 +-
 .../procedure2/store/wal/WALProcedureStore.html |   193 +-
 .../hadoop/hbase/quotas/package-tree.html       |    10 +-
 .../hadoop/hbase/regionserver/package-tree.html |    14 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../hadoop/hbase/replication/package-tree.html  |     2 +-
 .../apache/hadoop/hbase/rest/TableResource.html |    30 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     4 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |     6 +-
 .../snapshot/SnapshotDescriptionUtils.html      |   219 +-
 .../SnapshotManifest.RegionVisitor.html         |    12 +-
 .../hadoop/hbase/snapshot/SnapshotManifest.html |   116 +-
 .../SnapshotManifestV1.ManifestBuilder.html     |    44 +-
 .../hbase/snapshot/SnapshotManifestV1.html      |     6 +-
 .../SnapshotManifestV2.ManifestBuilder.html     |    22 +-
 .../hbase/snapshot/SnapshotManifestV2.html      |     6 +-
 .../class-use/HBaseSnapshotException.html       |    19 -
 .../class-use/SnapshotCreationException.html    |     7 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     8 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../snapshot/DisabledTableSnapshotHandler.html  |   135 +-
 .../snapshot/EnabledTableSnapshotHandler.html   |     2 +-
 .../master/snapshot/MasterSnapshotVerifier.html |   307 +-
 .../hbase/master/snapshot/SnapshotManager.html  |  1450 +-
 .../master/snapshot/TakeSnapshotHandler.html    |   621 +-
 .../wal/WALProcedureStore.LeaseRecovery.html    |  2300 +-
 .../store/wal/WALProcedureStore.PushType.html   |  2300 +-
 .../wal/WALProcedureStore.SyncMetrics.html      |  2300 +-
 .../procedure2/store/wal/WALProcedureStore.html |  2300 +-
 .../HRegion.BatchOperation.Visitor.html         |     2 +-
 .../regionserver/HRegion.BatchOperation.html    |     2 +-
 .../regionserver/HRegion.BulkLoadListener.html  |     2 +-
 .../HRegion.FlushResult.Result.html             |     2 +-
 .../hbase/regionserver/HRegion.FlushResult.html |     2 +-
 .../regionserver/HRegion.FlushResultImpl.html   |     2 +-
 .../HRegion.MutationBatchOperation.html         |     2 +-
 .../HRegion.ObservedExceptionsInBatch.html      |     2 +-
 .../HRegion.PrepareFlushResult.html             |     2 +-
 .../regionserver/HRegion.RegionScannerImpl.html |     2 +-
 .../HRegion.ReplayBatchOperation.html           |     2 +-
 .../regionserver/HRegion.RowLockContext.html    |     2 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html |     2 +-
 .../hbase/regionserver/HRegion.WriteState.html  |     2 +-
 .../hadoop/hbase/regionserver/HRegion.html      |     2 +-
 .../apache/hadoop/hbase/rest/TableResource.html |   354 +-
 .../hbase/snapshot/ExportSnapshot.Counter.html  |   340 +-
 .../snapshot/ExportSnapshot.ExportMapper.html   |   340 +-
 ...hotInputFormat.ExportSnapshotInputSplit.html |   340 +-
 ...tInputFormat.ExportSnapshotRecordReader.html |   340 +-
 ...xportSnapshot.ExportSnapshotInputFormat.html |   340 +-
 .../hbase/snapshot/ExportSnapshot.Options.html  |   340 +-
 .../hbase/snapshot/ExportSnapshot.Testing.html  |   340 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |   340 +-
 ...Utils.CompletedSnaphotDirectoriesFilter.html |   603 +-
 .../snapshot/SnapshotDescriptionUtils.html      |   603 +-
 .../SnapshotManifest.RegionVisitor.html         |   971 +-
 .../hadoop/hbase/snapshot/SnapshotManifest.html |   971 +-
 .../SnapshotManifestV1.ManifestBuilder.html     |   289 +-
 .../hbase/snapshot/SnapshotManifestV1.html      |   289 +-
 .../SnapshotManifestV2.ManifestBuilder.html     |   251 +-
 .../hbase/snapshot/SnapshotManifestV2.html      |   251 +-
 downloads.html                                  |     4 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/allclasses-frame.html            |     4 +
 testdevapidocs/allclasses-noframe.html          |     4 +
 testdevapidocs/constant-values.html             |    33 +
 testdevapidocs/index-all.html                   |   115 +
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../hbase/class-use/HBaseClassTestRule.html     |   138 +-
 .../hbase/class-use/HBaseTestingUtility.html    |    20 +-
 .../client/TestSnapshotCloneIndependence.html   |     4 +-
 .../TestSnapshotDFSTemporaryDirectory.html      |   357 +
 .../hbase/client/TestSnapshotFromAdmin.html     |     4 +-
 .../hbase/client/TestSnapshotMetadata.html      |     4 +-
 .../client/TestSnapshotTemporaryDirectory.html  |   679 +
 ...hotTemporaryDirectoryWithRegionReplicas.html |   331 +
 .../hbase/client/TestSnapshotWithAcl.html       |     4 +-
 .../TestSnapshotDFSTemporaryDirectory.html      |   125 +
 .../TestSnapshotTemporaryDirectory.html         |   172 +
 ...hotTemporaryDirectoryWithRegionReplicas.html |   125 +
 .../hadoop/hbase/client/package-frame.html      |     3 +
 .../hadoop/hbase/client/package-summary.html    |    46 +-
 .../hadoop/hbase/client/package-tree.html       |     6 +
 .../apache/hadoop/hbase/client/package-use.html |     6 +
 .../snapshot/TestSnapshotHFileCleaner.html      |     4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 ...manceEvaluation.NoSyncWalProcedureStore.html |     2 +-
 ...LProcedureStore.TestSequentialProcedure.html |    16 +-
 .../store/wal/TestWALProcedureStore.html        |   104 +-
 .../TestAtomicOperation.AtomicOperation.html    |    14 +-
 .../TestAtomicOperation.CheckAndPutThread.html  |     8 +-
 .../TestAtomicOperation.Incrementer.html        |    12 +-
 ...micOperation.MockHRegion.WrappedRowLock.html |     8 +-
 .../TestAtomicOperation.MockHRegion.html        |     6 +-
 .../TestAtomicOperation.PutThread.html          |     8 +-
 .../TestAtomicOperation.TestStep.html           |    16 +-
 .../hbase/regionserver/TestAtomicOperation.html |    92 +-
 .../hadoop/hbase/regionserver/package-tree.html |     4 +-
 ...bleScan.ClientSideCellSetModel.Listener.html |     4 +-
 .../TestTableScan.ClientSideCellSetModel.html   |    12 +-
 .../hbase/rest/TestTableScan.CustomFilter.html  |    10 +-
 .../apache/hadoop/hbase/rest/TestTableScan.html |   124 +-
 .../hbase/snapshot/TestExportSnapshot.html      |     2 +-
 .../snapshot/TestExportSnapshotNoCluster.html   |     4 +-
 ...estExportSnapshotWithTemporaryDirectory.html |   391 +
 .../snapshot/TestFlushSnapshotFromClient.html   |     4 +-
 .../snapshot/TestSnapshotDescriptionUtils.html  |    52 +-
 .../snapshot/class-use/TestExportSnapshot.html  |     8 +-
 ...estExportSnapshotWithTemporaryDirectory.html |   125 +
 .../hadoop/hbase/snapshot/package-frame.html    |     1 +
 .../hadoop/hbase/snapshot/package-summary.html  |    30 +-
 .../hadoop/hbase/snapshot/package-tree.html     |     1 +
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 testdevapidocs/overview-tree.html               |     7 +
 .../TestSnapshotDFSTemporaryDirectory.html      |   151 +
 .../client/TestSnapshotTemporaryDirectory.html  |   543 +
 ...hotTemporaryDirectoryWithRegionReplicas.html |   109 +
 .../TestSnapshotHFileCleaner.SnapshotFiles.html |   102 +-
 .../snapshot/TestSnapshotHFileCleaner.html      |   102 +-
 ...LProcedureStore.TestSequentialProcedure.html |   162 +-
 .../store/wal/TestWALProcedureStore.html        |   162 +-
 .../TestAtomicOperation.AtomicOperation.html    |  1443 +-
 .../TestAtomicOperation.CheckAndPutThread.html  |  1443 +-
 .../TestAtomicOperation.Incrementer.html        |  1443 +-
 ...micOperation.MockHRegion.WrappedRowLock.html |  1443 +-
 .../TestAtomicOperation.MockHRegion.html        |  1443 +-
 .../TestAtomicOperation.PutThread.html          |  1443 +-
 .../TestAtomicOperation.TestStep.html           |  1443 +-
 .../hbase/regionserver/TestAtomicOperation.html |  1443 +-
 ...bleScan.ClientSideCellSetModel.Listener.html |  1185 +-
 .../TestTableScan.ClientSideCellSetModel.html   |  1185 +-
 .../hbase/rest/TestTableScan.CustomFilter.html  |  1185 +-
 .../apache/hadoop/hbase/rest/TestTableScan.html |  1185 +-
 ...hotTestingUtils.SnapshotMock.RegionData.html |     4 +-
 ...stingUtils.SnapshotMock.SnapshotBuilder.html |     4 +-
 .../SnapshotTestingUtils.SnapshotMock.html      |     4 +-
 .../hbase/snapshot/SnapshotTestingUtils.html    |     4 +-
 ...estExportSnapshotWithTemporaryDirectory.html |   132 +
 .../hbase/snapshot/TestRegionSnapshotTask.html  |     4 +-
 .../snapshot/TestSnapshotDescriptionUtils.html  |   235 +-
 197 files changed, 46245 insertions(+), 41533 deletions(-)
----------------------------------------------------------------------


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


[28/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Testing.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 


[33/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
index df746ae..d27bef3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
@@ -208,1157 +208,1163 @@
 <span class="sourceLineNo">200</span>      throws IOException {<a name="line.200"></a>
 <span class="sourceLineNo">201</span>    this(conf,<a name="line.201"></a>
 <span class="sourceLineNo">202</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        new Path(CommonFSUtils.getRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME), leaseRecovery);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  @VisibleForTesting<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.conf = conf;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    this.leaseRecovery = leaseRecovery;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.walDir = walDir;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    this.walArchiveDir = walArchiveDir;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.fs = walDir.getFileSystem(conf);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    // Create the log directory for the procedure store<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (!fs.exists(walDir)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      if (!fs.mkdirs(walDir)) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // Now that it exists, set the log policy<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    String storagePolicy =<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (LOG.isDebugEnabled()) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          LOG.debug("Created Procedure Store WAL archive dir " + this.walArchiveDir);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        LOG.warn("Failed create of " + this.walArchiveDir);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public void start(int numSlots) throws IOException {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    if (!setRunning(true)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      return;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // Init buffer slots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    loading.set(true);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    runningProcCount = numSlots;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    syncMaxSlot = numSlots;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    slots = new ByteSlot[numSlots];<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    slotsCache = new LinkedTransferQueue();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      slotsCache.offer(new ByteSlot());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Tunings<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    walCountWarnThreshold =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    maxRetriesBeforeRoll =<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // WebUI<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    syncMetricsQueue = new CircularFifoQueue(<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Init sync thread<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      public void run() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        try {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          syncLoop();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        } catch (Throwable e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          if (!isSyncAborted()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>            sendAbortProcessSignal();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          }<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>    };<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    syncThread.start();<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>  @Override<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public void stop(final boolean abort) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    if (!setRunning(false)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      return;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    sendStopSignal();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (!isSyncAborted()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        while (syncThread.isAlive()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          sendStopSignal();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          syncThread.join(250);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      } catch (InterruptedException e) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        LOG.warn("join interrupted", e);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        Thread.currentThread().interrupt();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    // Close the writer<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    closeCurrentLogStream();<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    // Close the old logs<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // they should be already closed, this is just in case the load fails<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // and we call start() and then stop()<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    for (ProcedureWALFile log: logs) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      log.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    logs.clear();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    loading.set(true);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>  private void sendStopSignal() {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    if (lock.tryLock()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      try {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        waitCond.signalAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        syncCond.signalAll();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      } finally {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        lock.unlock();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  public int getNumThreads() {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    return slots == null ? 0 : slots.length;<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>  @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  public int setRunningProcedureCount(final int count) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return this.runningProcCount;<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>  public ProcedureStoreTracker getStoreTracker() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return storeTracker;<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>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    lock.lock();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    try {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      return new ArrayList&lt;&gt;(logs);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    } finally {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      lock.unlock();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<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>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    return corruptedLogs;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  @Override<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  public void recoverLease() throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    lock.lock();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      boolean afterFirstAttempt = false;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      while (isRunning()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        // Don't sleep before first attempt<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        if (afterFirstAttempt) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.371"></a>
-<span class="sourceLineNo">372</span>              waitBeforeRoll);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          afterFirstAttempt = true;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        // Get Log-MaxID and recover lease on old logs<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        try {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          flushLogId = initOldLogs(oldLogs);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        } catch (FileNotFoundException e) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          continue;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // Create new state-log<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          // someone else has already created this log<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          continue;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>        // We have the lease on the log<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        oldLogs = getLogFiles();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          if (LOG.isDebugEnabled()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            LOG.debug("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        break;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    } finally {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      lock.unlock();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  @Override<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  public void load(final ProcedureLoader loader) throws IOException {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    lock.lock();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (logs.isEmpty()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      // Nothing to do, If we have only the current log.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      if (logs.size() == 1) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.trace("No state logs to replay.");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        loader.setMaxProcId(0);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        return;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      // Load the old logs<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      final Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      it.next(); // Skip the current log<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>        @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        public void setMaxProcId(long maxProcId) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          loader.setMaxProcId(maxProcId);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>        @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          loader.load(procIter);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>        @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          loader.handleCorrupted(procIter);<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>        @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          if (corruptedLogs == null) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          corruptedLogs.add(log);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          // TODO: sideline corrupted log<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      });<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    } finally {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      try {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        // try to cleanup inactive wals and complete the operation<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        buildHoldingCleanupTracker();<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        tryCleanupLogsOnLoad();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        loading.set(false);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      } finally {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        lock.unlock();<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>  private void tryCleanupLogsOnLoad() {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // nothing to cleanup.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (logs.size() &lt;= 1) return;<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>    // the config says to not cleanup wals on load.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    try {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      periodicRoll();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    } catch (IOException e) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public void insert(final Procedure proc, final Procedure[] subprocs) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    if (LOG.isTraceEnabled()) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      LOG.trace("Insert " + proc + ", subproc=" + Arrays.toString(subprocs));<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>    ByteSlot slot = acquireSlot();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // Serialize the insert<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      long[] subProcIds = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (subprocs != null) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        ProcedureWALFormat.writeInsert(slot, proc, subprocs);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        subProcIds = new long[subprocs.length];<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        for (int i = 0; i &lt; subprocs.length; ++i) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          subProcIds[i] = subprocs[i].getProcId();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      } else {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        assert !proc.hasParent();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        ProcedureWALFormat.writeInsert(slot, proc);<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>      // Push the transaction data and wait until it is persisted<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      pushData(PushType.INSERT, slot, proc.getProcId(), subProcIds);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    } catch (IOException e) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      // We are not able to serialize the procedure.<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      // this is a code error, and we are not able to go on.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: proc=" +<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          proc + ", subprocs=" + Arrays.toString(subprocs), e);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      throw new RuntimeException(e);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    } finally {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      releaseSlot(slot);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>  @Override<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  public void insert(final Procedure[] procs) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    if (LOG.isTraceEnabled()) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      LOG.trace("Insert " + Arrays.toString(procs));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>    ByteSlot slot = acquireSlot();<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Serialize the insert<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      long[] procIds = new long[procs.length];<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      for (int i = 0; i &lt; procs.length; ++i) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        assert !procs[i].hasParent();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        procIds[i] = procs[i].getProcId();<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        ProcedureWALFormat.writeInsert(slot, procs[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      pushData(PushType.INSERT, slot, Procedure.NO_PROC_ID, procIds);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    } catch (IOException e) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      // We are not able to serialize the procedure.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // this is a code error, and we are not able to go on.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: " +<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          Arrays.toString(procs), e);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      throw new RuntimeException(e);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    } finally {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      releaseSlot(slot);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public void update(final Procedure proc) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    if (LOG.isTraceEnabled()) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      LOG.trace("Update " + proc);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    ByteSlot slot = acquireSlot();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      // Serialize the update<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      ProcedureWALFormat.writeUpdate(slot, proc);<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Push the transaction data and wait until it is persisted<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      pushData(PushType.UPDATE, slot, proc.getProcId(), null);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } catch (IOException e) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      // We are not able to serialize the procedure.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      // this is a code error, and we are not able to go on.<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      throw new RuntimeException(e);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    } finally {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      releaseSlot(slot);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  public void delete(final long procId) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    if (LOG.isTraceEnabled()) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      LOG.trace("Delete " + procId);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>    ByteSlot slot = acquireSlot();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      // Serialize the delete<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      ProcedureWALFormat.writeDelete(slot, procId);<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>      // Push the transaction data and wait until it is persisted<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      pushData(PushType.DELETE, slot, procId, null);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } catch (IOException e) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      // We are not able to serialize the procedure.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // this is a code error, and we are not able to go on.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + procId, e);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      throw new RuntimeException(e);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    } finally {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      releaseSlot(slot);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>  @Override<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  public void delete(final Procedure proc, final long[] subProcIds) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assert proc != null : "expected a non-null procedure";<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    assert subProcIds != null &amp;&amp; subProcIds.length &gt; 0 : "expected subProcIds";<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    if (LOG.isTraceEnabled()) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      LOG.trace("Update " + proc + " and Delete " + Arrays.toString(subProcIds));<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>    ByteSlot slot = acquireSlot();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    try {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      // Serialize the delete<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      ProcedureWALFormat.writeDelete(slot, proc, subProcIds);<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>      // Push the transaction data and wait until it is persisted<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      pushData(PushType.DELETE, slot, proc.getProcId(), subProcIds);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    } catch (IOException e) {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      // We are not able to serialize the procedure.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      // this is a code error, and we are not able to go on.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      throw new RuntimeException(e);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    } finally {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      releaseSlot(slot);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>  @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  public void delete(final long[] procIds, final int offset, final int count) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    if (count == 0) return;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if (offset == 0 &amp;&amp; count == procIds.length) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      delete(procIds);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    } else if (count == 1) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      delete(procIds[offset]);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    } else {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      delete(Arrays.copyOfRange(procIds, offset, offset + count));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>  private void delete(final long[] procIds) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    if (LOG.isTraceEnabled()) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      LOG.trace("Delete " + Arrays.toString(procIds));<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    final ByteSlot slot = acquireSlot();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    try {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      // Serialize the delete<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>        ProcedureWALFormat.writeDelete(slot, procIds[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      pushData(PushType.DELETE, slot, Procedure.NO_PROC_ID, procIds);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    } catch (IOException e) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      // We are not able to serialize the procedure.<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      // this is a code error, and we are not able to go on.<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      LOG.error("Unable to serialize the procedures: " + Arrays.toString(procIds), e);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      throw new RuntimeException(e);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    } finally {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      releaseSlot(slot);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private ByteSlot acquireSlot() {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    ByteSlot slot = slotsCache.poll();<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    return slot != null ? slot : new ByteSlot();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  private void releaseSlot(final ByteSlot slot) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    slot.reset();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    slotsCache.offer(slot);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private enum PushType { INSERT, UPDATE, DELETE }<a name="line.666"></a>
-<span class="sourceLineNo">667</span><a name="line.667"></a>
-<span class="sourceLineNo">668</span>  private long pushData(final PushType type, final ByteSlot slot,<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      final long procId, final long[] subProcIds) {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    if (!isRunning()) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      throw new RuntimeException("the store must be running before inserting data");<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    if (logs.isEmpty()) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      throw new RuntimeException("recoverLease() must be called before inserting data");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
-<span class="sourceLineNo">676</span><a name="line.676"></a>
-<span class="sourceLineNo">677</span>    long logId = -1;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    lock.lock();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      // Wait for the sync to be completed<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      while (true) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        if (!isRunning()) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>          throw new RuntimeException("store no longer running");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        } else if (isSyncAborted()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>          throw new RuntimeException("sync aborted", syncException.get());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        } else if (inSync.get()) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          syncCond.await();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        } else if (slotIndex &gt;= syncMaxSlot) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>          slotCond.signal();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          syncCond.await();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        } else {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          break;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      final long pushSyncId = syncId.get();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      updateStoreTracker(type, procId, subProcIds);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      slots[slotIndex++] = slot;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      logId = flushLogId;<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      // Notify that there is new data<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (slotIndex == 1) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        waitCond.signal();<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>      // Notify that the slots are full<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      if (slotIndex == syncMaxSlot) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        waitCond.signal();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        slotCond.signal();<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      }<a name="line.710"></a>
-<span class="sourceLineNo">711</span><a name="line.711"></a>
-<span class="sourceLineNo">712</span>      while (pushSyncId == syncId.get() &amp;&amp; isRunning()) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        syncCond.await();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      }<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    } catch (InterruptedException e) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      Thread.currentThread().interrupt();<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      sendAbortProcessSignal();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      throw new RuntimeException(e);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    } finally {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      lock.unlock();<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      if (isSyncAborted()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        throw new RuntimeException("sync aborted", syncException.get());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      }<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    return logId;<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>  private void updateStoreTracker(final PushType type,<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      final long procId, final long[] subProcIds) {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    switch (type) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      case INSERT:<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        if (subProcIds == null) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>          storeTracker.insert(procId);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        } else if (procId == Procedure.NO_PROC_ID) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>          storeTracker.insert(subProcIds);<a name="line.735"></a>
-<span class="sourceLineNo">736</span>        } else {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          storeTracker.insert(procId, subProcIds);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        break;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      case UPDATE:<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        storeTracker.update(procId);<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        break;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      case DELETE:<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        if (subProcIds != null &amp;&amp; subProcIds.length &gt; 0) {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>          storeTracker.delete(subProcIds);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>          holdingCleanupTracker.setDeletedIfSet(subProcIds);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        } else {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>          storeTracker.delete(procId);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        break;<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      default:<a name="line.754"></a>
-<span class="sourceLineNo">755</span>        throw new RuntimeException("invalid push type " + type);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    }<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  }<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>  private boolean isSyncAborted() {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    return syncException.get() != null;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>  private void syncLoop() throws Throwable {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    long totalSyncedToStore = 0;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    inSync.set(false);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    lock.lock();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    try {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      while (isRunning()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        try {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>          // Wait until new data is available<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          if (slotIndex == 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>            if (!loading.get()) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>              periodicRoll();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>            }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>            if (LOG.isTraceEnabled()) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>              float rollTsSec = getMillisFromLastRoll() / 1000.0f;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>              LOG.trace(String.format("Waiting for data. flushed=%s (%s/sec)",<a name="line.778"></a>
-<span class="sourceLineNo">779</span>                        StringUtils.humanSize(totalSynced.get()),<a name="line.779"></a>
-<span class="sourceLineNo">780</span>                        StringUtils.humanSize(totalSynced.get() / rollTsSec)));<a name="line.780"></a>
-<span class="sourceLineNo">781</span>            }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>            waitCond.await(getMillisToNextPeriodicRoll(), TimeUnit.MILLISECONDS);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>            if (slotIndex == 0) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>              // no data.. probably a stop() or a periodic roll<a name="line.785"></a>
-<span class="sourceLineNo">786</span>              continue;<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>          // Wait SYNC_WAIT_MSEC or the signal of "slots full" before flushing<a name="line.789"></a>
-<span class="sourceLineNo">790</span>          syncMaxSlot = runningProcCount;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>          assert syncMaxSlot &gt; 0 : "unexpected syncMaxSlot=" + syncMaxSlot;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>          final long syncWaitSt = System.currentTimeMillis();<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          if (slotIndex != syncMaxSlot) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>            slotCond.await(syncWaitMsec, TimeUnit.MILLISECONDS);<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>          final long currentTs = System.currentTimeMillis();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>          final long syncWaitMs = currentTs - syncWaitSt;<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          final float rollSec = getMillisFromLastRoll() / 1000.0f;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          final float syncedPerSec = totalSyncedToStore / rollSec;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          if (LOG.isTraceEnabled() &amp;&amp; (syncWaitMs &gt; 10 || slotIndex &lt; syncMaxSlot)) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>            LOG.trace(String.format("Sync wait %s, slotIndex=%s , totalSynced=%s (%s/sec)",<a name="line.802"></a>
-<span class="sourceLineNo">803</span>                      StringUtils.humanTimeDiff(syncWaitMs), slotIndex,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>                      StringUtils.humanSize(totalSyncedToStore),<a name="line.804"></a>
-<span class="sourceLineNo">805</span>                      StringUtils.humanSize(syncedPerSec)));<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>          // update webui circular buffers (TODO: get rid of allocations)<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          final SyncMetrics syncMetrics = new SyncMetrics();<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          syncMetrics.timestamp = currentTs;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          syncMetrics.syncWaitMs = syncWaitMs;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          syncMetrics.syncedEntries = slotIndex;<a name="line.812"></a>
-<span class="sourceLineNo">813</span>          syncMetrics.totalSyncedBytes = totalSyncedToStore;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          syncMetrics.syncedPerSec = syncedPerSec;<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          syncMetricsQueue.add(syncMetrics);<a name="line.815"></a>
-<span class="sourceLineNo">816</span><a name="line.816"></a>
-<span class="sourceLineNo">817</span>          // sync<a name="line.817"></a>
-<span class="sourceLineNo">818</span>          inSync.set(true);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>          long slotSize = syncSlots();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          logs.getLast().addToSize(slotSize);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>          totalSyncedToStore = totalSynced.addAndGet(slotSize);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>          slotIndex = 0;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>          inSync.set(false);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>          syncId.incrementAndGet();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>        } catch (InterruptedException e) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>          Thread.currentThread().interrupt();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>          syncException.compareAndSet(null, e);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>          sendAbortProcessSignal();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          throw e;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        } catch (Throwable t) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          syncException.compareAndSet(null, t);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          sendAbortProcessSignal();<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          throw t;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        } finally {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          syncCond.signalAll();<a name="line.835"></a>
-<span class="sourceLineNo">836</span>        }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    } finally {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      lock.unlock();<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>  public ArrayList&lt;SyncMetrics&gt; getSyncMetrics() {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    lock.lock();<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    try {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      return new ArrayList&lt;&gt;(syncMetricsQueue);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    } finally {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      lock.unlock();<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>  private long syncSlots() throws Throwable {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    int retry = 0;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    int logRolled = 0;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    long totalSynced = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    do {<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      try {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        totalSynced = syncSlots(stream, slots, 0, slotIndex);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        break;<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      } catch (Throwable e) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>        LOG.warn("unable to sync slots, retry=" + retry);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        if (++retry &gt;= maxRetriesBeforeRoll) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          if (logRolled &gt;= maxSyncFailureRoll &amp;&amp; isRunning()) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            LOG.error("Sync slots after log roll failed, abort.", e);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>            throw e;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>          }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!rollWriterWithRetries()) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            throw e;<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>          logRolled++;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>          retry = 0;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>        }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      }<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    } while (isRunning());<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    return totalSynced;<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>  protected long syncSlots(final FSDataOutputStream stream, final ByteSlot[] slots,<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      final int offset, final int count) throws IOException {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    long totalSynced = 0;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    for (int i = 0; i &lt; count; ++i) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final ByteSlot data = slots[offset + i];<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      data.writeTo(stream);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      totalSynced += data.size();<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    syncStream(stream);<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    sendPostSyncSignal();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    if (LOG.isTraceEnabled()) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      LOG.trace("Sync slots=" + count + '/' + syncMaxSlot +<a name="line.893"></a>
-<span class="sourceLineNo">894</span>                ", flushed=" + StringUtils.humanSize(totalSynced));<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    return totalSynced;<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>  protected void syncStream(final FSDataOutputStream stream) throws IOException {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (useHsync) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      stream.hsync();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    } else {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      stream.hflush();<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>  private boolean rollWriterWithRetries() {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    for (int i = 0; i &lt; rollRetries &amp;&amp; isRunning(); ++i) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      if (i &gt; 0) Threads.sleepWithoutInterrupt(waitBeforeRoll * i);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>      try {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        if (rollWriter()) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>          return true;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        }<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      } catch (IOException e) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        LOG.warn("Unable to roll the log, attempt=" + (i + 1), e);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    LOG.error(HBaseMarkers.FATAL, "Unable to roll the log");<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    return false;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>  }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>  private boolean tryRollWriter() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    try {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      return rollWriter();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    } catch (IOException e) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      LOG.warn("Unable to roll the log", e);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return false;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  }<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>  public long getMillisToNextPeriodicRoll() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    if (lastRollTs.get() &gt; 0 &amp;&amp; periodicRollMsec &gt; 0) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return periodicRollMsec - getMillisFromLastRoll();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    return Long.MAX_VALUE;<a name="line.936"></a>
-<span class="sourceLineNo">937</span>  }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>  public long getMillisFromLastRoll() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    return (System.currentTimeMillis() - lastRollTs.get());<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>  @VisibleForTesting<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  protected void periodicRollForTesting() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    lock.lock();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    try {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      periodicRoll();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      lock.unlock();<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>  @VisibleForTesting<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  protected boolean rollWriterForTesting() throws IOException {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    lock.lock();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    try {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      return rollWriter();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    } finally {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      lock.unlock();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    }<a name="line.960"></a>
-<span class="sourceLineNo">961</span>  }<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>  @VisibleForTesting<a name="line.963"></a>
-<span class="sourceLineNo">964</span>  protected void removeInactiveLogsForTesting() throws Exception {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    lock.lock();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    try {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      removeInactiveLogs();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    } finally  {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      lock.unlock();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  private void periodicRoll() throws IOException {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    if (storeTracker.isEmpty()) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (LOG.isTraceEnabled()) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        LOG.trace("no active procedures");<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      tryRollWriter();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      removeAllLogs(flushLogId - 1);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    } else {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      if (storeTracker.isUpdated()) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        if (LOG.isTraceEnabled()) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          LOG.trace("all the active procedures are in the latest log");<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        }<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        removeAllLogs(flushLogId - 1);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>      // if the log size has exceeded the roll threshold<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      // or the periodic roll timeout is expired, try to roll the wal.<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      if (totalSynced.get() &gt; rollThreshold || getMillisToNextPeriodicRoll() &lt;= 0) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        tryRollWriter();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span><a name="line.993"></a>
-<span class="sourceLineNo">994</span>      removeInactiveLogs();<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>  private boolean rollWriter() throws IOException {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    if (!isRunning()) return false;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span><a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    // Create new state-log<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    if (!rollWriter(flushLogId + 1)) {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      LOG.warn("someone else has already created log " + flushLogId);<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      return false;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    }<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span><a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    // We have the lease on the log,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    // but we should check if someone else has created new files<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (getMaxLogId(getLogFiles()) &gt; flushLogId) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.warn("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      logs.getLast().removeFile(this.walArchiveDir);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      return false;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    }<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    // We have the lease on the log<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    return true;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>  @VisibleForTesting<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  boolean rollWriter(final long logId) throws IOException {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    assert logId &gt; flushLogId : "logId=" + logId + " flushLogId=" + flushLogId;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    assert lock.isHeldByCurrentThread() : "expected to be the lock owner. " + lock.isLocked();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    ProcedureWALHeader header = ProcedureWALHeader.newBuilder()<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      .setVersion(ProcedureWALFormat.HEADER_VERSION)<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      .setType(ProcedureWALFormat.LOG_TYPE_STREAM)<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      .setMinProcId(storeTracker.getActiveMinProcId())<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      .setLogId(logId)<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      .build();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    FSDataOutputStream newStream = null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    Path newLogFile = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    long startPos = -1;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    newLogFile = getLogFilePath(logId);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    try {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      newStream = CommonFSUtils.createForWal(fs, newLogFile, false);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (FileAlreadyExistsException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      LOG.error("Log file with id=" + logId + " already exists", e);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return false;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } catch (RemoteException re) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      LOG.warn("failed to create log file with id=" + logId, re);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      return false;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    }<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    // After we create the stream but before we attempt to use it at all<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    // ensure that we can provide the level of data safety we're configured<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    // to provide.<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    final String durability = useHsync ? "hsync" : "hflush";<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (enforceStreamCapability &amp;&amp; !(CommonFSUtils.hasCapability(newStream, durability))) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        throw new IllegalStateException("The procedure WAL relies on the ability to " + durability +<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          " for proper operation during component failures, but the underlying filesystem does " +<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          "not support doing so. Please check the config value of '" + USE_HSYNC_CONF_KEY +<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>          "' to set the desired level of robustness and ensure the config value of '" +<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>          CommonFSUtils.HBASE_WAL_DIR + "' points to a FileSystem mount that can provide it.");<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    try {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      ProcedureWALFormat.writeHeader(newStream, header);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      startPos = newStream.getPos();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    } catch (IOException ioe) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      LOG.warn("Encountered exception writing header", ioe);<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      newStream.close();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    closeCurrentLogStream();<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span><a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    storeTracker.resetUpdates();<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    stream = newStream;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    flushLogId = logId;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    totalSynced.set(0);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    long rollTs = System.currentTimeMillis();<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    lastRollTs.set(rollTs);<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    logs.add(new ProcedureWALFile(fs, newLogFile, header, startPos, rollTs));<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // if it's the first next WAL being added, build the holding cleanup tracker<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    if (logs.size() == 2) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      buildHoldingCleanupTracker();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    } else if (logs.size() &gt; walCountWarnThreshold) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      LOG.warn("procedure WALs count=" + logs.size() +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        " above the warning threshold " + walCountWarnThreshold +<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        ". check running procedures to see if something is stuck.");<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span><a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    LOG.info("Rolled new Procedure Store WAL, id={}", logId);<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>    return true;<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>  }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  private void closeCurrentLogStream() {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    if (stream == null || logs.isEmpty()) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      return;<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>    try {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      ProcedureWALFile log = logs.getLast();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      log.setProcIds(storeTracker.getUpdatedMinProcId(), storeTracker.getUpdatedMaxProcId());<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      log.updateLocalTracker(storeTracker);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      long trailerSize = ProcedureWALFormat.writeTrailer(stream, storeTracker);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      log.addToSize(trailerSize);<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (IOException e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.warn("Unable to write the trailer: " + e.getMessage());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    try {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      stream.close();<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    } catch (IOException e) {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      LOG.error("Unable to close the stream", e);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    stream = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  // ==========================================================================<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  //  Log Files cleaner helpers<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  // ==========================================================================<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  private void removeInactiveLogs() throws IOException {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    // We keep track of which procedures are holding the oldest WAL in 'holdingCleanupTracker'.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    // once there is nothing olding the oldest WAL we can remove it.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    while (logs.size() &gt; 1 &amp;&amp; holdingCleanupTracker.isEmpty()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      removeLogFile(logs.getFirst(), walArchiveDir);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      buildHoldingCleanupTracker();<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span><a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    // TODO: In case we are holding up a lot of logs for long time we should<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    // rewrite old procedures (in theory parent procs) to the new WAL.<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  private void buildHoldingCleanupTracker() {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (logs.size() &lt;= 1) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      // we only have one wal, so nothing to do<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      holdingCleanupTracker.reset();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span><a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    // compute the holding tracker.<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    //  - the first WAL is used for the 'updates'<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    //  - the other WALs are scanned to remove procs already in other wals.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    // TODO: exit early if holdingCleanupTracker.isEmpty()<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    holdingCleanupTracker.resetTo(logs.getFirst().getTracker(), true);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    holdingCleanupTracker.setDeletedIfSet(storeTracker);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    for (int i = 1, size = logs.size() - 1; i &lt; size; ++i) {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      holdingCleanupTracker.setDeletedIfSet(logs.get(i).getTracker());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<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>  /**<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * Remove all logs with logId &lt;= {@code lastLogId}.<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   */<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  private void removeAllLogs(long lastLogId) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    if (logs.size() &lt;= 1) return;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    if (LOG.isTraceEnabled()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      LOG.trace("Remove all state logs with ID less than " + lastLogId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span><a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    boolean removed = false;<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    while (logs.size() &gt; 1) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span> 

<TRUNCATED>

[36/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
index df746ae..d27bef3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
@@ -208,1157 +208,1163 @@
 <span class="sourceLineNo">200</span>      throws IOException {<a name="line.200"></a>
 <span class="sourceLineNo">201</span>    this(conf,<a name="line.201"></a>
 <span class="sourceLineNo">202</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        new Path(CommonFSUtils.getRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME), leaseRecovery);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  @VisibleForTesting<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.conf = conf;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    this.leaseRecovery = leaseRecovery;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.walDir = walDir;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    this.walArchiveDir = walArchiveDir;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.fs = walDir.getFileSystem(conf);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    // Create the log directory for the procedure store<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (!fs.exists(walDir)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      if (!fs.mkdirs(walDir)) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // Now that it exists, set the log policy<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    String storagePolicy =<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (LOG.isDebugEnabled()) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          LOG.debug("Created Procedure Store WAL archive dir " + this.walArchiveDir);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        LOG.warn("Failed create of " + this.walArchiveDir);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public void start(int numSlots) throws IOException {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    if (!setRunning(true)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      return;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // Init buffer slots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    loading.set(true);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    runningProcCount = numSlots;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    syncMaxSlot = numSlots;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    slots = new ByteSlot[numSlots];<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    slotsCache = new LinkedTransferQueue();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      slotsCache.offer(new ByteSlot());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Tunings<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    walCountWarnThreshold =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    maxRetriesBeforeRoll =<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // WebUI<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    syncMetricsQueue = new CircularFifoQueue(<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Init sync thread<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      public void run() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        try {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          syncLoop();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        } catch (Throwable e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          if (!isSyncAborted()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>            sendAbortProcessSignal();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          }<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>    };<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    syncThread.start();<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>  @Override<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public void stop(final boolean abort) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    if (!setRunning(false)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      return;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    sendStopSignal();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (!isSyncAborted()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        while (syncThread.isAlive()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          sendStopSignal();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          syncThread.join(250);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      } catch (InterruptedException e) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        LOG.warn("join interrupted", e);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        Thread.currentThread().interrupt();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    // Close the writer<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    closeCurrentLogStream();<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    // Close the old logs<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // they should be already closed, this is just in case the load fails<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // and we call start() and then stop()<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    for (ProcedureWALFile log: logs) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      log.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    logs.clear();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    loading.set(true);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>  private void sendStopSignal() {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    if (lock.tryLock()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      try {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        waitCond.signalAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        syncCond.signalAll();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      } finally {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        lock.unlock();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  public int getNumThreads() {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    return slots == null ? 0 : slots.length;<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>  @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  public int setRunningProcedureCount(final int count) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return this.runningProcCount;<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>  public ProcedureStoreTracker getStoreTracker() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return storeTracker;<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>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    lock.lock();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    try {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      return new ArrayList&lt;&gt;(logs);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    } finally {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      lock.unlock();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<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>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    return corruptedLogs;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  @Override<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  public void recoverLease() throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    lock.lock();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      boolean afterFirstAttempt = false;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      while (isRunning()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        // Don't sleep before first attempt<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        if (afterFirstAttempt) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.371"></a>
-<span class="sourceLineNo">372</span>              waitBeforeRoll);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          afterFirstAttempt = true;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        // Get Log-MaxID and recover lease on old logs<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        try {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          flushLogId = initOldLogs(oldLogs);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        } catch (FileNotFoundException e) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          continue;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // Create new state-log<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          // someone else has already created this log<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          continue;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>        // We have the lease on the log<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        oldLogs = getLogFiles();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          if (LOG.isDebugEnabled()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            LOG.debug("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        break;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    } finally {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      lock.unlock();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  @Override<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  public void load(final ProcedureLoader loader) throws IOException {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    lock.lock();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (logs.isEmpty()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      // Nothing to do, If we have only the current log.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      if (logs.size() == 1) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.trace("No state logs to replay.");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        loader.setMaxProcId(0);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        return;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      // Load the old logs<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      final Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      it.next(); // Skip the current log<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>        @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        public void setMaxProcId(long maxProcId) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          loader.setMaxProcId(maxProcId);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>        @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          loader.load(procIter);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>        @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          loader.handleCorrupted(procIter);<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>        @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          if (corruptedLogs == null) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          corruptedLogs.add(log);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          // TODO: sideline corrupted log<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      });<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    } finally {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      try {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        // try to cleanup inactive wals and complete the operation<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        buildHoldingCleanupTracker();<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        tryCleanupLogsOnLoad();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        loading.set(false);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      } finally {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        lock.unlock();<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>  private void tryCleanupLogsOnLoad() {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // nothing to cleanup.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (logs.size() &lt;= 1) return;<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>    // the config says to not cleanup wals on load.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    try {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      periodicRoll();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    } catch (IOException e) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public void insert(final Procedure proc, final Procedure[] subprocs) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    if (LOG.isTraceEnabled()) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      LOG.trace("Insert " + proc + ", subproc=" + Arrays.toString(subprocs));<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>    ByteSlot slot = acquireSlot();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // Serialize the insert<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      long[] subProcIds = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (subprocs != null) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        ProcedureWALFormat.writeInsert(slot, proc, subprocs);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        subProcIds = new long[subprocs.length];<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        for (int i = 0; i &lt; subprocs.length; ++i) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          subProcIds[i] = subprocs[i].getProcId();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      } else {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        assert !proc.hasParent();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        ProcedureWALFormat.writeInsert(slot, proc);<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>      // Push the transaction data and wait until it is persisted<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      pushData(PushType.INSERT, slot, proc.getProcId(), subProcIds);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    } catch (IOException e) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      // We are not able to serialize the procedure.<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      // this is a code error, and we are not able to go on.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: proc=" +<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          proc + ", subprocs=" + Arrays.toString(subprocs), e);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      throw new RuntimeException(e);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    } finally {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      releaseSlot(slot);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>  @Override<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  public void insert(final Procedure[] procs) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    if (LOG.isTraceEnabled()) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      LOG.trace("Insert " + Arrays.toString(procs));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>    ByteSlot slot = acquireSlot();<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Serialize the insert<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      long[] procIds = new long[procs.length];<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      for (int i = 0; i &lt; procs.length; ++i) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        assert !procs[i].hasParent();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        procIds[i] = procs[i].getProcId();<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        ProcedureWALFormat.writeInsert(slot, procs[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      pushData(PushType.INSERT, slot, Procedure.NO_PROC_ID, procIds);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    } catch (IOException e) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      // We are not able to serialize the procedure.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // this is a code error, and we are not able to go on.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: " +<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          Arrays.toString(procs), e);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      throw new RuntimeException(e);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    } finally {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      releaseSlot(slot);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public void update(final Procedure proc) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    if (LOG.isTraceEnabled()) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      LOG.trace("Update " + proc);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    ByteSlot slot = acquireSlot();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      // Serialize the update<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      ProcedureWALFormat.writeUpdate(slot, proc);<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Push the transaction data and wait until it is persisted<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      pushData(PushType.UPDATE, slot, proc.getProcId(), null);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } catch (IOException e) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      // We are not able to serialize the procedure.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      // this is a code error, and we are not able to go on.<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      throw new RuntimeException(e);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    } finally {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      releaseSlot(slot);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  public void delete(final long procId) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    if (LOG.isTraceEnabled()) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      LOG.trace("Delete " + procId);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>    ByteSlot slot = acquireSlot();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      // Serialize the delete<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      ProcedureWALFormat.writeDelete(slot, procId);<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>      // Push the transaction data and wait until it is persisted<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      pushData(PushType.DELETE, slot, procId, null);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } catch (IOException e) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      // We are not able to serialize the procedure.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // this is a code error, and we are not able to go on.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + procId, e);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      throw new RuntimeException(e);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    } finally {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      releaseSlot(slot);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>  @Override<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  public void delete(final Procedure proc, final long[] subProcIds) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assert proc != null : "expected a non-null procedure";<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    assert subProcIds != null &amp;&amp; subProcIds.length &gt; 0 : "expected subProcIds";<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    if (LOG.isTraceEnabled()) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      LOG.trace("Update " + proc + " and Delete " + Arrays.toString(subProcIds));<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>    ByteSlot slot = acquireSlot();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    try {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      // Serialize the delete<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      ProcedureWALFormat.writeDelete(slot, proc, subProcIds);<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>      // Push the transaction data and wait until it is persisted<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      pushData(PushType.DELETE, slot, proc.getProcId(), subProcIds);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    } catch (IOException e) {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      // We are not able to serialize the procedure.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      // this is a code error, and we are not able to go on.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      throw new RuntimeException(e);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    } finally {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      releaseSlot(slot);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>  @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  public void delete(final long[] procIds, final int offset, final int count) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    if (count == 0) return;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if (offset == 0 &amp;&amp; count == procIds.length) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      delete(procIds);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    } else if (count == 1) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      delete(procIds[offset]);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    } else {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      delete(Arrays.copyOfRange(procIds, offset, offset + count));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>  private void delete(final long[] procIds) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    if (LOG.isTraceEnabled()) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      LOG.trace("Delete " + Arrays.toString(procIds));<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    final ByteSlot slot = acquireSlot();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    try {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      // Serialize the delete<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>        ProcedureWALFormat.writeDelete(slot, procIds[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      pushData(PushType.DELETE, slot, Procedure.NO_PROC_ID, procIds);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    } catch (IOException e) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      // We are not able to serialize the procedure.<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      // this is a code error, and we are not able to go on.<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      LOG.error("Unable to serialize the procedures: " + Arrays.toString(procIds), e);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      throw new RuntimeException(e);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    } finally {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      releaseSlot(slot);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private ByteSlot acquireSlot() {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    ByteSlot slot = slotsCache.poll();<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    return slot != null ? slot : new ByteSlot();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  private void releaseSlot(final ByteSlot slot) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    slot.reset();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    slotsCache.offer(slot);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private enum PushType { INSERT, UPDATE, DELETE }<a name="line.666"></a>
-<span class="sourceLineNo">667</span><a name="line.667"></a>
-<span class="sourceLineNo">668</span>  private long pushData(final PushType type, final ByteSlot slot,<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      final long procId, final long[] subProcIds) {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    if (!isRunning()) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      throw new RuntimeException("the store must be running before inserting data");<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    if (logs.isEmpty()) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      throw new RuntimeException("recoverLease() must be called before inserting data");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
-<span class="sourceLineNo">676</span><a name="line.676"></a>
-<span class="sourceLineNo">677</span>    long logId = -1;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    lock.lock();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      // Wait for the sync to be completed<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      while (true) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        if (!isRunning()) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>          throw new RuntimeException("store no longer running");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        } else if (isSyncAborted()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>          throw new RuntimeException("sync aborted", syncException.get());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        } else if (inSync.get()) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          syncCond.await();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        } else if (slotIndex &gt;= syncMaxSlot) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>          slotCond.signal();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          syncCond.await();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        } else {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          break;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      final long pushSyncId = syncId.get();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      updateStoreTracker(type, procId, subProcIds);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      slots[slotIndex++] = slot;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      logId = flushLogId;<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      // Notify that there is new data<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (slotIndex == 1) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        waitCond.signal();<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>      // Notify that the slots are full<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      if (slotIndex == syncMaxSlot) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        waitCond.signal();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        slotCond.signal();<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      }<a name="line.710"></a>
-<span class="sourceLineNo">711</span><a name="line.711"></a>
-<span class="sourceLineNo">712</span>      while (pushSyncId == syncId.get() &amp;&amp; isRunning()) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        syncCond.await();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      }<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    } catch (InterruptedException e) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      Thread.currentThread().interrupt();<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      sendAbortProcessSignal();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      throw new RuntimeException(e);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    } finally {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      lock.unlock();<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      if (isSyncAborted()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        throw new RuntimeException("sync aborted", syncException.get());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      }<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    return logId;<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>  private void updateStoreTracker(final PushType type,<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      final long procId, final long[] subProcIds) {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    switch (type) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      case INSERT:<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        if (subProcIds == null) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>          storeTracker.insert(procId);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        } else if (procId == Procedure.NO_PROC_ID) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>          storeTracker.insert(subProcIds);<a name="line.735"></a>
-<span class="sourceLineNo">736</span>        } else {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          storeTracker.insert(procId, subProcIds);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        break;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      case UPDATE:<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        storeTracker.update(procId);<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        break;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      case DELETE:<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        if (subProcIds != null &amp;&amp; subProcIds.length &gt; 0) {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>          storeTracker.delete(subProcIds);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>          holdingCleanupTracker.setDeletedIfSet(subProcIds);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        } else {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>          storeTracker.delete(procId);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        break;<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      default:<a name="line.754"></a>
-<span class="sourceLineNo">755</span>        throw new RuntimeException("invalid push type " + type);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    }<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  }<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>  private boolean isSyncAborted() {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    return syncException.get() != null;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>  private void syncLoop() throws Throwable {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    long totalSyncedToStore = 0;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    inSync.set(false);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    lock.lock();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    try {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      while (isRunning()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        try {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>          // Wait until new data is available<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          if (slotIndex == 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>            if (!loading.get()) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>              periodicRoll();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>            }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>            if (LOG.isTraceEnabled()) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>              float rollTsSec = getMillisFromLastRoll() / 1000.0f;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>              LOG.trace(String.format("Waiting for data. flushed=%s (%s/sec)",<a name="line.778"></a>
-<span class="sourceLineNo">779</span>                        StringUtils.humanSize(totalSynced.get()),<a name="line.779"></a>
-<span class="sourceLineNo">780</span>                        StringUtils.humanSize(totalSynced.get() / rollTsSec)));<a name="line.780"></a>
-<span class="sourceLineNo">781</span>            }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>            waitCond.await(getMillisToNextPeriodicRoll(), TimeUnit.MILLISECONDS);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>            if (slotIndex == 0) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>              // no data.. probably a stop() or a periodic roll<a name="line.785"></a>
-<span class="sourceLineNo">786</span>              continue;<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>          // Wait SYNC_WAIT_MSEC or the signal of "slots full" before flushing<a name="line.789"></a>
-<span class="sourceLineNo">790</span>          syncMaxSlot = runningProcCount;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>          assert syncMaxSlot &gt; 0 : "unexpected syncMaxSlot=" + syncMaxSlot;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>          final long syncWaitSt = System.currentTimeMillis();<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          if (slotIndex != syncMaxSlot) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>            slotCond.await(syncWaitMsec, TimeUnit.MILLISECONDS);<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>          final long currentTs = System.currentTimeMillis();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>          final long syncWaitMs = currentTs - syncWaitSt;<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          final float rollSec = getMillisFromLastRoll() / 1000.0f;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          final float syncedPerSec = totalSyncedToStore / rollSec;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          if (LOG.isTraceEnabled() &amp;&amp; (syncWaitMs &gt; 10 || slotIndex &lt; syncMaxSlot)) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>            LOG.trace(String.format("Sync wait %s, slotIndex=%s , totalSynced=%s (%s/sec)",<a name="line.802"></a>
-<span class="sourceLineNo">803</span>                      StringUtils.humanTimeDiff(syncWaitMs), slotIndex,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>                      StringUtils.humanSize(totalSyncedToStore),<a name="line.804"></a>
-<span class="sourceLineNo">805</span>                      StringUtils.humanSize(syncedPerSec)));<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>          // update webui circular buffers (TODO: get rid of allocations)<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          final SyncMetrics syncMetrics = new SyncMetrics();<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          syncMetrics.timestamp = currentTs;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          syncMetrics.syncWaitMs = syncWaitMs;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          syncMetrics.syncedEntries = slotIndex;<a name="line.812"></a>
-<span class="sourceLineNo">813</span>          syncMetrics.totalSyncedBytes = totalSyncedToStore;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          syncMetrics.syncedPerSec = syncedPerSec;<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          syncMetricsQueue.add(syncMetrics);<a name="line.815"></a>
-<span class="sourceLineNo">816</span><a name="line.816"></a>
-<span class="sourceLineNo">817</span>          // sync<a name="line.817"></a>
-<span class="sourceLineNo">818</span>          inSync.set(true);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>          long slotSize = syncSlots();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          logs.getLast().addToSize(slotSize);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>          totalSyncedToStore = totalSynced.addAndGet(slotSize);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>          slotIndex = 0;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>          inSync.set(false);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>          syncId.incrementAndGet();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>        } catch (InterruptedException e) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>          Thread.currentThread().interrupt();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>          syncException.compareAndSet(null, e);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>          sendAbortProcessSignal();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          throw e;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        } catch (Throwable t) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          syncException.compareAndSet(null, t);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          sendAbortProcessSignal();<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          throw t;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        } finally {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          syncCond.signalAll();<a name="line.835"></a>
-<span class="sourceLineNo">836</span>        }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    } finally {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      lock.unlock();<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>  public ArrayList&lt;SyncMetrics&gt; getSyncMetrics() {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    lock.lock();<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    try {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      return new ArrayList&lt;&gt;(syncMetricsQueue);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    } finally {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      lock.unlock();<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>  private long syncSlots() throws Throwable {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    int retry = 0;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    int logRolled = 0;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    long totalSynced = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    do {<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      try {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        totalSynced = syncSlots(stream, slots, 0, slotIndex);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        break;<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      } catch (Throwable e) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>        LOG.warn("unable to sync slots, retry=" + retry);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        if (++retry &gt;= maxRetriesBeforeRoll) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          if (logRolled &gt;= maxSyncFailureRoll &amp;&amp; isRunning()) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            LOG.error("Sync slots after log roll failed, abort.", e);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>            throw e;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>          }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!rollWriterWithRetries()) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            throw e;<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>          logRolled++;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>          retry = 0;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>        }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      }<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    } while (isRunning());<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    return totalSynced;<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>  protected long syncSlots(final FSDataOutputStream stream, final ByteSlot[] slots,<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      final int offset, final int count) throws IOException {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    long totalSynced = 0;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    for (int i = 0; i &lt; count; ++i) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final ByteSlot data = slots[offset + i];<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      data.writeTo(stream);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      totalSynced += data.size();<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    syncStream(stream);<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    sendPostSyncSignal();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    if (LOG.isTraceEnabled()) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      LOG.trace("Sync slots=" + count + '/' + syncMaxSlot +<a name="line.893"></a>
-<span class="sourceLineNo">894</span>                ", flushed=" + StringUtils.humanSize(totalSynced));<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    return totalSynced;<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>  protected void syncStream(final FSDataOutputStream stream) throws IOException {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (useHsync) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      stream.hsync();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    } else {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      stream.hflush();<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>  private boolean rollWriterWithRetries() {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    for (int i = 0; i &lt; rollRetries &amp;&amp; isRunning(); ++i) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      if (i &gt; 0) Threads.sleepWithoutInterrupt(waitBeforeRoll * i);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>      try {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        if (rollWriter()) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>          return true;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        }<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      } catch (IOException e) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        LOG.warn("Unable to roll the log, attempt=" + (i + 1), e);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    LOG.error(HBaseMarkers.FATAL, "Unable to roll the log");<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    return false;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>  }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>  private boolean tryRollWriter() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    try {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      return rollWriter();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    } catch (IOException e) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      LOG.warn("Unable to roll the log", e);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return false;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  }<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>  public long getMillisToNextPeriodicRoll() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    if (lastRollTs.get() &gt; 0 &amp;&amp; periodicRollMsec &gt; 0) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return periodicRollMsec - getMillisFromLastRoll();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    return Long.MAX_VALUE;<a name="line.936"></a>
-<span class="sourceLineNo">937</span>  }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>  public long getMillisFromLastRoll() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    return (System.currentTimeMillis() - lastRollTs.get());<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>  @VisibleForTesting<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  protected void periodicRollForTesting() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    lock.lock();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    try {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      periodicRoll();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      lock.unlock();<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>  @VisibleForTesting<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  protected boolean rollWriterForTesting() throws IOException {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    lock.lock();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    try {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      return rollWriter();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    } finally {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      lock.unlock();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    }<a name="line.960"></a>
-<span class="sourceLineNo">961</span>  }<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>  @VisibleForTesting<a name="line.963"></a>
-<span class="sourceLineNo">964</span>  protected void removeInactiveLogsForTesting() throws Exception {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    lock.lock();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    try {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      removeInactiveLogs();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    } finally  {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      lock.unlock();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  private void periodicRoll() throws IOException {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    if (storeTracker.isEmpty()) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (LOG.isTraceEnabled()) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        LOG.trace("no active procedures");<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      tryRollWriter();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      removeAllLogs(flushLogId - 1);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    } else {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      if (storeTracker.isUpdated()) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        if (LOG.isTraceEnabled()) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          LOG.trace("all the active procedures are in the latest log");<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        }<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        removeAllLogs(flushLogId - 1);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>      // if the log size has exceeded the roll threshold<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      // or the periodic roll timeout is expired, try to roll the wal.<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      if (totalSynced.get() &gt; rollThreshold || getMillisToNextPeriodicRoll() &lt;= 0) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        tryRollWriter();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span><a name="line.993"></a>
-<span class="sourceLineNo">994</span>      removeInactiveLogs();<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>  private boolean rollWriter() throws IOException {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    if (!isRunning()) return false;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span><a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    // Create new state-log<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    if (!rollWriter(flushLogId + 1)) {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      LOG.warn("someone else has already created log " + flushLogId);<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      return false;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    }<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span><a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    // We have the lease on the log,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    // but we should check if someone else has created new files<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (getMaxLogId(getLogFiles()) &gt; flushLogId) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.warn("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      logs.getLast().removeFile(this.walArchiveDir);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      return false;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    }<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    // We have the lease on the log<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    return true;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>  @VisibleForTesting<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  boolean rollWriter(final long logId) throws IOException {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    assert logId &gt; flushLogId : "logId=" + logId + " flushLogId=" + flushLogId;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    assert lock.isHeldByCurrentThread() : "expected to be the lock owner. " + lock.isLocked();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    ProcedureWALHeader header = ProcedureWALHeader.newBuilder()<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      .setVersion(ProcedureWALFormat.HEADER_VERSION)<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      .setType(ProcedureWALFormat.LOG_TYPE_STREAM)<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      .setMinProcId(storeTracker.getActiveMinProcId())<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      .setLogId(logId)<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      .build();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    FSDataOutputStream newStream = null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    Path newLogFile = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    long startPos = -1;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    newLogFile = getLogFilePath(logId);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    try {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      newStream = CommonFSUtils.createForWal(fs, newLogFile, false);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (FileAlreadyExistsException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      LOG.error("Log file with id=" + logId + " already exists", e);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return false;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } catch (RemoteException re) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      LOG.warn("failed to create log file with id=" + logId, re);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      return false;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    }<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    // After we create the stream but before we attempt to use it at all<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    // ensure that we can provide the level of data safety we're configured<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    // to provide.<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    final String durability = useHsync ? "hsync" : "hflush";<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (enforceStreamCapability &amp;&amp; !(CommonFSUtils.hasCapability(newStream, durability))) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        throw new IllegalStateException("The procedure WAL relies on the ability to " + durability +<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          " for proper operation during component failures, but the underlying filesystem does " +<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          "not support doing so. Please check the config value of '" + USE_HSYNC_CONF_KEY +<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>          "' to set the desired level of robustness and ensure the config value of '" +<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>          CommonFSUtils.HBASE_WAL_DIR + "' points to a FileSystem mount that can provide it.");<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    try {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      ProcedureWALFormat.writeHeader(newStream, header);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      startPos = newStream.getPos();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    } catch (IOException ioe) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      LOG.warn("Encountered exception writing header", ioe);<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      newStream.close();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    closeCurrentLogStream();<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span><a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    storeTracker.resetUpdates();<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    stream = newStream;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    flushLogId = logId;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    totalSynced.set(0);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    long rollTs = System.currentTimeMillis();<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    lastRollTs.set(rollTs);<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    logs.add(new ProcedureWALFile(fs, newLogFile, header, startPos, rollTs));<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // if it's the first next WAL being added, build the holding cleanup tracker<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    if (logs.size() == 2) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      buildHoldingCleanupTracker();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    } else if (logs.size() &gt; walCountWarnThreshold) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      LOG.warn("procedure WALs count=" + logs.size() +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        " above the warning threshold " + walCountWarnThreshold +<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        ". check running procedures to see if something is stuck.");<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span><a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    LOG.info("Rolled new Procedure Store WAL, id={}", logId);<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>    return true;<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>  }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  private void closeCurrentLogStream() {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    if (stream == null || logs.isEmpty()) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      return;<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>    try {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      ProcedureWALFile log = logs.getLast();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      log.setProcIds(storeTracker.getUpdatedMinProcId(), storeTracker.getUpdatedMaxProcId());<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      log.updateLocalTracker(storeTracker);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      long trailerSize = ProcedureWALFormat.writeTrailer(stream, storeTracker);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      log.addToSize(trailerSize);<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (IOException e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.warn("Unable to write the trailer: " + e.getMessage());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    try {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      stream.close();<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    } catch (IOException e) {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      LOG.error("Unable to close the stream", e);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    stream = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  // ==========================================================================<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  //  Log Files cleaner helpers<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  // ==========================================================================<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  private void removeInactiveLogs() throws IOException {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    // We keep track of which procedures are holding the oldest WAL in 'holdingCleanupTracker'.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    // once there is nothing olding the oldest WAL we can remove it.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    while (logs.size() &gt; 1 &amp;&amp; holdingCleanupTracker.isEmpty()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      removeLogFile(logs.getFirst(), walArchiveDir);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      buildHoldingCleanupTracker();<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span><a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    // TODO: In case we are holding up a lot of logs for long time we should<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    // rewrite old procedures (in theory parent procs) to the new WAL.<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  private void buildHoldingCleanupTracker() {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (logs.size() &lt;= 1) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      // we only have one wal, so nothing to do<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      holdingCleanupTracker.reset();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span><a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    // compute the holding tracker.<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    //  - the first WAL is used for the 'updates'<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    //  - the other WALs are scanned to remove procs already in other wals.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    // TODO: exit early if holdingCleanupTracker.isEmpty()<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    holdingCleanupTracker.resetTo(logs.getFirst().getTracker(), true);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    holdingCleanupTracker.setDeletedIfSet(storeTracker);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    for (int i = 1, size = logs.size() - 1; i &lt; size; ++i) {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      holdingCleanupTracker.setDeletedIfSet(logs.get(i).getTracker());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<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>  /**<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * Remove all logs with logId &lt;= {@code lastLogId}.<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   */<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  private void removeAllLogs(long lastLogId) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    if (logs.size() &lt;= 1) return;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    if (LOG.isTraceEnabled()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      LOG.trace("Remove all state logs with ID less than " + lastLogId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span><a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    boolean removed = false;<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    while (logs.size() &gt;

<TRUNCATED>

[31/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 


[14/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
index a18e598..44f63ea 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html
@@ -906,82 +906,98 @@
 <span class="sourceLineNo">898</span>    assertEquals("WALs=" + procStore.getActiveLogs(), 1, procStore.getActiveLogs().size());<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 LoadCounter restartAndAssert(long maxProcId, long runnableCount,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      int completedCount, int corruptedCount) throws Exception {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    return ProcedureTestingUtility.storeRestartAndAssert(procStore, maxProcId,<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      runnableCount, completedCount, corruptedCount);<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>  private void corruptLog(final FileStatus logFile, final long dropBytes)<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      throws IOException {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    assertTrue(logFile.getLen() &gt; dropBytes);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    LOG.debug("corrupt log " + logFile.getPath() +<a name="line.910"></a>
-<span class="sourceLineNo">911</span>              " size=" + logFile.getLen() + " drop=" + dropBytes);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    Path tmpPath = new Path(testDir, "corrupted.log");<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    InputStream in = fs.open(logFile.getPath());<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    OutputStream out =  fs.create(tmpPath);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    IOUtils.copyBytes(in, out, logFile.getLen() - dropBytes, true);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    if (!fs.rename(tmpPath, logFile.getPath())) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      throw new IOException("Unable to rename");<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span>  }<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>  private void verifyProcIdsOnRestart(final Set&lt;Long&gt; procIds) throws Exception {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    LOG.debug("expected: " + procIds);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    LoadCounter loader = new LoadCounter();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    storeRestart(loader);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    assertEquals(procIds.size(), loader.getLoadedCount());<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    assertEquals(0, loader.getCorruptedCount());<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  private void assertEmptyLogDir() {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    try {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      FileStatus[] status = fs.listStatus(logDir);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      assertTrue("expected empty state-log dir", status == null || status.length == 0);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    } catch (FileNotFoundException e) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      fail("expected the state-log dir to be present: " + logDir);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    } catch (IOException e) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      fail("got en exception on state-log dir list: " + e.getMessage());<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    }<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>  public static class TestSequentialProcedure extends SequentialProcedure&lt;Void&gt; {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    private static long seqid = 0;<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    public TestSequentialProcedure() {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      setProcId(++seqid);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>    @Override<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Procedure[] execute(Void env) { return null; }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(Void env) { }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>    @Override<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    protected boolean abort(Void env) { return false; }<a name="line.954"></a>
+<span class="sourceLineNo">901</span>  @Test<a name="line.901"></a>
+<span class="sourceLineNo">902</span>  public void testWALDirAndWALArchiveDir() throws IOException {<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    Configuration conf = htu.getConfiguration();<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    procStore = createWALProcedureStore(conf);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    assertEquals(procStore.getFileSystem(), procStore.getWalArchiveDir().getFileSystem(conf));<a name="line.905"></a>
+<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>  private WALProcedureStore createWALProcedureStore(Configuration conf) throws IOException {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    return new WALProcedureStore(conf, new WALProcedureStore.LeaseRecovery() {<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      @Override<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      public void recoverFileLease(FileSystem fs, Path path) throws IOException {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        // no-op<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>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  private LoadCounter restartAndAssert(long maxProcId, long runnableCount,<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      int completedCount, int corruptedCount) throws Exception {<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    return ProcedureTestingUtility.storeRestartAndAssert(procStore, maxProcId,<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      runnableCount, completedCount, corruptedCount);<a name="line.920"></a>
+<span class="sourceLineNo">921</span>  }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>  private void corruptLog(final FileStatus logFile, final long dropBytes)<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      throws IOException {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    assertTrue(logFile.getLen() &gt; dropBytes);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>    LOG.debug("corrupt log " + logFile.getPath() +<a name="line.926"></a>
+<span class="sourceLineNo">927</span>              " size=" + logFile.getLen() + " drop=" + dropBytes);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    Path tmpPath = new Path(testDir, "corrupted.log");<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    InputStream in = fs.open(logFile.getPath());<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    OutputStream out =  fs.create(tmpPath);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    IOUtils.copyBytes(in, out, logFile.getLen() - dropBytes, true);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    if (!fs.rename(tmpPath, logFile.getPath())) {<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      throw new IOException("Unable to rename");<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>  private void verifyProcIdsOnRestart(final Set&lt;Long&gt; procIds) throws Exception {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    LOG.debug("expected: " + procIds);<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    LoadCounter loader = new LoadCounter();<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    storeRestart(loader);<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    assertEquals(procIds.size(), loader.getLoadedCount());<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    assertEquals(0, loader.getCorruptedCount());<a name="line.942"></a>
+<span class="sourceLineNo">943</span>  }<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>  private void assertEmptyLogDir() {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    try {<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      FileStatus[] status = fs.listStatus(logDir);<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      assertTrue("expected empty state-log dir", status == null || status.length == 0);<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    } catch (FileNotFoundException e) {<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      fail("expected the state-log dir to be present: " + logDir);<a name="line.950"></a>
+<span class="sourceLineNo">951</span>    } catch (IOException e) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      fail("got en exception on state-log dir list: " + e.getMessage());<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">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.957"></a>
-<span class="sourceLineNo">958</span>        throws IOException {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      long procId = getProcId();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      if (procId % 2 == 0) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>        Int64Value.Builder builder = Int64Value.newBuilder().setValue(procId);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        serializer.serialize(builder.build());<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
+<span class="sourceLineNo">956</span>  public static class TestSequentialProcedure extends SequentialProcedure&lt;Void&gt; {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    private static long seqid = 0;<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    public TestSequentialProcedure() {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      setProcId(++seqid);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    }<a name="line.961"></a>
+<span class="sourceLineNo">962</span><a name="line.962"></a>
+<span class="sourceLineNo">963</span>    @Override<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    protected Procedure[] execute(Void env) { return null; }<a name="line.964"></a>
 <span class="sourceLineNo">965</span><a name="line.965"></a>
 <span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      long procId = getProcId();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      if (procId % 2 == 0) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        Int64Value value = serializer.deserialize(Int64Value.class);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        assertEquals(procId, value.getValue());<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span>}<a name="line.976"></a>
+<span class="sourceLineNo">967</span>    protected void rollback(Void env) { }<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>    @Override<a name="line.969"></a>
+<span class="sourceLineNo">970</span>    protected boolean abort(Void env) { return false; }<a name="line.970"></a>
+<span class="sourceLineNo">971</span><a name="line.971"></a>
+<span class="sourceLineNo">972</span>    @Override<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        throws IOException {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      long procId = getProcId();<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (procId % 2 == 0) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        Int64Value.Builder builder = Int64Value.newBuilder().setValue(procId);<a name="line.977"></a>
+<span class="sourceLineNo">978</span>        serializer.serialize(builder.build());<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    }<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>    @Override<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        throws IOException {<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      long procId = getProcId();<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      if (procId % 2 == 0) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        Int64Value value = serializer.deserialize(Int64Value.class);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        assertEquals(procId, value.getValue());<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span>}<a name="line.992"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
index a18e598..44f63ea 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html
@@ -906,82 +906,98 @@
 <span class="sourceLineNo">898</span>    assertEquals("WALs=" + procStore.getActiveLogs(), 1, procStore.getActiveLogs().size());<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 LoadCounter restartAndAssert(long maxProcId, long runnableCount,<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      int completedCount, int corruptedCount) throws Exception {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    return ProcedureTestingUtility.storeRestartAndAssert(procStore, maxProcId,<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      runnableCount, completedCount, corruptedCount);<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>  private void corruptLog(final FileStatus logFile, final long dropBytes)<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      throws IOException {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    assertTrue(logFile.getLen() &gt; dropBytes);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    LOG.debug("corrupt log " + logFile.getPath() +<a name="line.910"></a>
-<span class="sourceLineNo">911</span>              " size=" + logFile.getLen() + " drop=" + dropBytes);<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    Path tmpPath = new Path(testDir, "corrupted.log");<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    InputStream in = fs.open(logFile.getPath());<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    OutputStream out =  fs.create(tmpPath);<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    IOUtils.copyBytes(in, out, logFile.getLen() - dropBytes, true);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    if (!fs.rename(tmpPath, logFile.getPath())) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      throw new IOException("Unable to rename");<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span>  }<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>  private void verifyProcIdsOnRestart(final Set&lt;Long&gt; procIds) throws Exception {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    LOG.debug("expected: " + procIds);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    LoadCounter loader = new LoadCounter();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    storeRestart(loader);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    assertEquals(procIds.size(), loader.getLoadedCount());<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    assertEquals(0, loader.getCorruptedCount());<a name="line.926"></a>
-<span class="sourceLineNo">927</span>  }<a name="line.927"></a>
-<span class="sourceLineNo">928</span><a name="line.928"></a>
-<span class="sourceLineNo">929</span>  private void assertEmptyLogDir() {<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    try {<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      FileStatus[] status = fs.listStatus(logDir);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      assertTrue("expected empty state-log dir", status == null || status.length == 0);<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    } catch (FileNotFoundException e) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      fail("expected the state-log dir to be present: " + logDir);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    } catch (IOException e) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      fail("got en exception on state-log dir list: " + e.getMessage());<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    }<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>  public static class TestSequentialProcedure extends SequentialProcedure&lt;Void&gt; {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    private static long seqid = 0;<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    public TestSequentialProcedure() {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      setProcId(++seqid);<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>    @Override<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    protected Procedure[] execute(Void env) { return null; }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(Void env) { }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>    @Override<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    protected boolean abort(Void env) { return false; }<a name="line.954"></a>
+<span class="sourceLineNo">901</span>  @Test<a name="line.901"></a>
+<span class="sourceLineNo">902</span>  public void testWALDirAndWALArchiveDir() throws IOException {<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    Configuration conf = htu.getConfiguration();<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    procStore = createWALProcedureStore(conf);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    assertEquals(procStore.getFileSystem(), procStore.getWalArchiveDir().getFileSystem(conf));<a name="line.905"></a>
+<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>  private WALProcedureStore createWALProcedureStore(Configuration conf) throws IOException {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    return new WALProcedureStore(conf, new WALProcedureStore.LeaseRecovery() {<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      @Override<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      public void recoverFileLease(FileSystem fs, Path path) throws IOException {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        // no-op<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>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  private LoadCounter restartAndAssert(long maxProcId, long runnableCount,<a name="line.917"></a>
+<span class="sourceLineNo">918</span>      int completedCount, int corruptedCount) throws Exception {<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    return ProcedureTestingUtility.storeRestartAndAssert(procStore, maxProcId,<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      runnableCount, completedCount, corruptedCount);<a name="line.920"></a>
+<span class="sourceLineNo">921</span>  }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>  private void corruptLog(final FileStatus logFile, final long dropBytes)<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      throws IOException {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    assertTrue(logFile.getLen() &gt; dropBytes);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>    LOG.debug("corrupt log " + logFile.getPath() +<a name="line.926"></a>
+<span class="sourceLineNo">927</span>              " size=" + logFile.getLen() + " drop=" + dropBytes);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    Path tmpPath = new Path(testDir, "corrupted.log");<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    InputStream in = fs.open(logFile.getPath());<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    OutputStream out =  fs.create(tmpPath);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>    IOUtils.copyBytes(in, out, logFile.getLen() - dropBytes, true);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>    if (!fs.rename(tmpPath, logFile.getPath())) {<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      throw new IOException("Unable to rename");<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>  private void verifyProcIdsOnRestart(final Set&lt;Long&gt; procIds) throws Exception {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    LOG.debug("expected: " + procIds);<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    LoadCounter loader = new LoadCounter();<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    storeRestart(loader);<a name="line.940"></a>
+<span class="sourceLineNo">941</span>    assertEquals(procIds.size(), loader.getLoadedCount());<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    assertEquals(0, loader.getCorruptedCount());<a name="line.942"></a>
+<span class="sourceLineNo">943</span>  }<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>  private void assertEmptyLogDir() {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    try {<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      FileStatus[] status = fs.listStatus(logDir);<a name="line.947"></a>
+<span class="sourceLineNo">948</span>      assertTrue("expected empty state-log dir", status == null || status.length == 0);<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    } catch (FileNotFoundException e) {<a name="line.949"></a>
+<span class="sourceLineNo">950</span>      fail("expected the state-log dir to be present: " + logDir);<a name="line.950"></a>
+<span class="sourceLineNo">951</span>    } catch (IOException e) {<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      fail("got en exception on state-log dir list: " + e.getMessage());<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">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.957"></a>
-<span class="sourceLineNo">958</span>        throws IOException {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      long procId = getProcId();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      if (procId % 2 == 0) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>        Int64Value.Builder builder = Int64Value.newBuilder().setValue(procId);<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        serializer.serialize(builder.build());<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
+<span class="sourceLineNo">956</span>  public static class TestSequentialProcedure extends SequentialProcedure&lt;Void&gt; {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    private static long seqid = 0;<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    public TestSequentialProcedure() {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>      setProcId(++seqid);<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    }<a name="line.961"></a>
+<span class="sourceLineNo">962</span><a name="line.962"></a>
+<span class="sourceLineNo">963</span>    @Override<a name="line.963"></a>
+<span class="sourceLineNo">964</span>    protected Procedure[] execute(Void env) { return null; }<a name="line.964"></a>
 <span class="sourceLineNo">965</span><a name="line.965"></a>
 <span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      long procId = getProcId();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      if (procId % 2 == 0) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>        Int64Value value = serializer.deserialize(Int64Value.class);<a name="line.971"></a>
-<span class="sourceLineNo">972</span>        assertEquals(procId, value.getValue());<a name="line.972"></a>
-<span class="sourceLineNo">973</span>      }<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>  }<a name="line.975"></a>
-<span class="sourceLineNo">976</span>}<a name="line.976"></a>
+<span class="sourceLineNo">967</span>    protected void rollback(Void env) { }<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>    @Override<a name="line.969"></a>
+<span class="sourceLineNo">970</span>    protected boolean abort(Void env) { return false; }<a name="line.970"></a>
+<span class="sourceLineNo">971</span><a name="line.971"></a>
+<span class="sourceLineNo">972</span>    @Override<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        throws IOException {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      long procId = getProcId();<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (procId % 2 == 0) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        Int64Value.Builder builder = Int64Value.newBuilder().setValue(procId);<a name="line.977"></a>
+<span class="sourceLineNo">978</span>        serializer.serialize(builder.build());<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>    }<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>    @Override<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        throws IOException {<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      long procId = getProcId();<a name="line.985"></a>
+<span class="sourceLineNo">986</span>      if (procId % 2 == 0) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>        Int64Value value = serializer.deserialize(Int64Value.class);<a name="line.987"></a>
+<span class="sourceLineNo">988</span>        assertEquals(procId, value.getValue());<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
+<span class="sourceLineNo">991</span>  }<a name="line.991"></a>
+<span class="sourceLineNo">992</span>}<a name="line.992"></a>
 
 
 


[35/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
index df746ae..d27bef3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
@@ -208,1157 +208,1163 @@
 <span class="sourceLineNo">200</span>      throws IOException {<a name="line.200"></a>
 <span class="sourceLineNo">201</span>    this(conf,<a name="line.201"></a>
 <span class="sourceLineNo">202</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        new Path(CommonFSUtils.getRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME), leaseRecovery);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  @VisibleForTesting<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.conf = conf;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    this.leaseRecovery = leaseRecovery;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.walDir = walDir;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    this.walArchiveDir = walArchiveDir;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.fs = walDir.getFileSystem(conf);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    // Create the log directory for the procedure store<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (!fs.exists(walDir)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      if (!fs.mkdirs(walDir)) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // Now that it exists, set the log policy<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    String storagePolicy =<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (LOG.isDebugEnabled()) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          LOG.debug("Created Procedure Store WAL archive dir " + this.walArchiveDir);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        LOG.warn("Failed create of " + this.walArchiveDir);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public void start(int numSlots) throws IOException {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    if (!setRunning(true)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      return;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // Init buffer slots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    loading.set(true);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    runningProcCount = numSlots;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    syncMaxSlot = numSlots;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    slots = new ByteSlot[numSlots];<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    slotsCache = new LinkedTransferQueue();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      slotsCache.offer(new ByteSlot());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Tunings<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    walCountWarnThreshold =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    maxRetriesBeforeRoll =<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // WebUI<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    syncMetricsQueue = new CircularFifoQueue(<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Init sync thread<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      public void run() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        try {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          syncLoop();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        } catch (Throwable e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          if (!isSyncAborted()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>            sendAbortProcessSignal();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          }<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>    };<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    syncThread.start();<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>  @Override<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public void stop(final boolean abort) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    if (!setRunning(false)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      return;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    sendStopSignal();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (!isSyncAborted()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        while (syncThread.isAlive()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          sendStopSignal();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          syncThread.join(250);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      } catch (InterruptedException e) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        LOG.warn("join interrupted", e);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        Thread.currentThread().interrupt();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    // Close the writer<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    closeCurrentLogStream();<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    // Close the old logs<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // they should be already closed, this is just in case the load fails<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // and we call start() and then stop()<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    for (ProcedureWALFile log: logs) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      log.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    logs.clear();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    loading.set(true);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>  private void sendStopSignal() {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    if (lock.tryLock()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      try {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        waitCond.signalAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        syncCond.signalAll();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      } finally {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        lock.unlock();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  public int getNumThreads() {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    return slots == null ? 0 : slots.length;<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>  @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  public int setRunningProcedureCount(final int count) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return this.runningProcCount;<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>  public ProcedureStoreTracker getStoreTracker() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return storeTracker;<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>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    lock.lock();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    try {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      return new ArrayList&lt;&gt;(logs);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    } finally {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      lock.unlock();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<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>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    return corruptedLogs;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  @Override<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  public void recoverLease() throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    lock.lock();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      boolean afterFirstAttempt = false;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      while (isRunning()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        // Don't sleep before first attempt<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        if (afterFirstAttempt) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.371"></a>
-<span class="sourceLineNo">372</span>              waitBeforeRoll);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          afterFirstAttempt = true;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        // Get Log-MaxID and recover lease on old logs<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        try {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          flushLogId = initOldLogs(oldLogs);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        } catch (FileNotFoundException e) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          continue;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // Create new state-log<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          // someone else has already created this log<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          continue;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>        // We have the lease on the log<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        oldLogs = getLogFiles();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          if (LOG.isDebugEnabled()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            LOG.debug("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        break;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    } finally {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      lock.unlock();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  @Override<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  public void load(final ProcedureLoader loader) throws IOException {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    lock.lock();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (logs.isEmpty()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      // Nothing to do, If we have only the current log.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      if (logs.size() == 1) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.trace("No state logs to replay.");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        loader.setMaxProcId(0);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        return;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      // Load the old logs<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      final Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      it.next(); // Skip the current log<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>        @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        public void setMaxProcId(long maxProcId) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          loader.setMaxProcId(maxProcId);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>        @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          loader.load(procIter);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>        @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          loader.handleCorrupted(procIter);<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>        @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          if (corruptedLogs == null) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          corruptedLogs.add(log);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          // TODO: sideline corrupted log<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      });<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    } finally {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      try {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        // try to cleanup inactive wals and complete the operation<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        buildHoldingCleanupTracker();<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        tryCleanupLogsOnLoad();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        loading.set(false);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      } finally {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        lock.unlock();<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>  private void tryCleanupLogsOnLoad() {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // nothing to cleanup.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (logs.size() &lt;= 1) return;<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>    // the config says to not cleanup wals on load.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    try {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      periodicRoll();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    } catch (IOException e) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public void insert(final Procedure proc, final Procedure[] subprocs) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    if (LOG.isTraceEnabled()) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      LOG.trace("Insert " + proc + ", subproc=" + Arrays.toString(subprocs));<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>    ByteSlot slot = acquireSlot();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // Serialize the insert<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      long[] subProcIds = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (subprocs != null) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        ProcedureWALFormat.writeInsert(slot, proc, subprocs);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        subProcIds = new long[subprocs.length];<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        for (int i = 0; i &lt; subprocs.length; ++i) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          subProcIds[i] = subprocs[i].getProcId();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      } else {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        assert !proc.hasParent();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        ProcedureWALFormat.writeInsert(slot, proc);<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>      // Push the transaction data and wait until it is persisted<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      pushData(PushType.INSERT, slot, proc.getProcId(), subProcIds);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    } catch (IOException e) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      // We are not able to serialize the procedure.<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      // this is a code error, and we are not able to go on.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: proc=" +<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          proc + ", subprocs=" + Arrays.toString(subprocs), e);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      throw new RuntimeException(e);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    } finally {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      releaseSlot(slot);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>  @Override<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  public void insert(final Procedure[] procs) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    if (LOG.isTraceEnabled()) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      LOG.trace("Insert " + Arrays.toString(procs));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>    ByteSlot slot = acquireSlot();<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Serialize the insert<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      long[] procIds = new long[procs.length];<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      for (int i = 0; i &lt; procs.length; ++i) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        assert !procs[i].hasParent();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        procIds[i] = procs[i].getProcId();<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        ProcedureWALFormat.writeInsert(slot, procs[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      pushData(PushType.INSERT, slot, Procedure.NO_PROC_ID, procIds);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    } catch (IOException e) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      // We are not able to serialize the procedure.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // this is a code error, and we are not able to go on.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: " +<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          Arrays.toString(procs), e);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      throw new RuntimeException(e);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    } finally {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      releaseSlot(slot);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public void update(final Procedure proc) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    if (LOG.isTraceEnabled()) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      LOG.trace("Update " + proc);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    ByteSlot slot = acquireSlot();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      // Serialize the update<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      ProcedureWALFormat.writeUpdate(slot, proc);<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Push the transaction data and wait until it is persisted<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      pushData(PushType.UPDATE, slot, proc.getProcId(), null);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } catch (IOException e) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      // We are not able to serialize the procedure.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      // this is a code error, and we are not able to go on.<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      throw new RuntimeException(e);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    } finally {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      releaseSlot(slot);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  public void delete(final long procId) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    if (LOG.isTraceEnabled()) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      LOG.trace("Delete " + procId);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>    ByteSlot slot = acquireSlot();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      // Serialize the delete<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      ProcedureWALFormat.writeDelete(slot, procId);<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>      // Push the transaction data and wait until it is persisted<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      pushData(PushType.DELETE, slot, procId, null);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } catch (IOException e) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      // We are not able to serialize the procedure.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // this is a code error, and we are not able to go on.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + procId, e);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      throw new RuntimeException(e);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    } finally {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      releaseSlot(slot);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>  @Override<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  public void delete(final Procedure proc, final long[] subProcIds) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assert proc != null : "expected a non-null procedure";<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    assert subProcIds != null &amp;&amp; subProcIds.length &gt; 0 : "expected subProcIds";<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    if (LOG.isTraceEnabled()) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      LOG.trace("Update " + proc + " and Delete " + Arrays.toString(subProcIds));<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>    ByteSlot slot = acquireSlot();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    try {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      // Serialize the delete<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      ProcedureWALFormat.writeDelete(slot, proc, subProcIds);<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>      // Push the transaction data and wait until it is persisted<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      pushData(PushType.DELETE, slot, proc.getProcId(), subProcIds);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    } catch (IOException e) {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      // We are not able to serialize the procedure.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      // this is a code error, and we are not able to go on.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      throw new RuntimeException(e);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    } finally {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      releaseSlot(slot);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>  @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  public void delete(final long[] procIds, final int offset, final int count) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    if (count == 0) return;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if (offset == 0 &amp;&amp; count == procIds.length) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      delete(procIds);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    } else if (count == 1) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      delete(procIds[offset]);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    } else {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      delete(Arrays.copyOfRange(procIds, offset, offset + count));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>  private void delete(final long[] procIds) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    if (LOG.isTraceEnabled()) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      LOG.trace("Delete " + Arrays.toString(procIds));<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    final ByteSlot slot = acquireSlot();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    try {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      // Serialize the delete<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>        ProcedureWALFormat.writeDelete(slot, procIds[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      pushData(PushType.DELETE, slot, Procedure.NO_PROC_ID, procIds);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    } catch (IOException e) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      // We are not able to serialize the procedure.<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      // this is a code error, and we are not able to go on.<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      LOG.error("Unable to serialize the procedures: " + Arrays.toString(procIds), e);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      throw new RuntimeException(e);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    } finally {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      releaseSlot(slot);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private ByteSlot acquireSlot() {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    ByteSlot slot = slotsCache.poll();<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    return slot != null ? slot : new ByteSlot();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  private void releaseSlot(final ByteSlot slot) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    slot.reset();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    slotsCache.offer(slot);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private enum PushType { INSERT, UPDATE, DELETE }<a name="line.666"></a>
-<span class="sourceLineNo">667</span><a name="line.667"></a>
-<span class="sourceLineNo">668</span>  private long pushData(final PushType type, final ByteSlot slot,<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      final long procId, final long[] subProcIds) {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    if (!isRunning()) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      throw new RuntimeException("the store must be running before inserting data");<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    if (logs.isEmpty()) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      throw new RuntimeException("recoverLease() must be called before inserting data");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
-<span class="sourceLineNo">676</span><a name="line.676"></a>
-<span class="sourceLineNo">677</span>    long logId = -1;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    lock.lock();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      // Wait for the sync to be completed<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      while (true) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        if (!isRunning()) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>          throw new RuntimeException("store no longer running");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        } else if (isSyncAborted()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>          throw new RuntimeException("sync aborted", syncException.get());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        } else if (inSync.get()) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          syncCond.await();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        } else if (slotIndex &gt;= syncMaxSlot) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>          slotCond.signal();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          syncCond.await();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        } else {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          break;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      final long pushSyncId = syncId.get();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      updateStoreTracker(type, procId, subProcIds);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      slots[slotIndex++] = slot;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      logId = flushLogId;<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      // Notify that there is new data<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (slotIndex == 1) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        waitCond.signal();<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>      // Notify that the slots are full<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      if (slotIndex == syncMaxSlot) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        waitCond.signal();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        slotCond.signal();<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      }<a name="line.710"></a>
-<span class="sourceLineNo">711</span><a name="line.711"></a>
-<span class="sourceLineNo">712</span>      while (pushSyncId == syncId.get() &amp;&amp; isRunning()) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        syncCond.await();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      }<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    } catch (InterruptedException e) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      Thread.currentThread().interrupt();<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      sendAbortProcessSignal();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      throw new RuntimeException(e);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    } finally {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      lock.unlock();<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      if (isSyncAborted()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        throw new RuntimeException("sync aborted", syncException.get());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      }<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    return logId;<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>  private void updateStoreTracker(final PushType type,<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      final long procId, final long[] subProcIds) {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    switch (type) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      case INSERT:<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        if (subProcIds == null) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>          storeTracker.insert(procId);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        } else if (procId == Procedure.NO_PROC_ID) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>          storeTracker.insert(subProcIds);<a name="line.735"></a>
-<span class="sourceLineNo">736</span>        } else {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          storeTracker.insert(procId, subProcIds);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        break;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      case UPDATE:<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        storeTracker.update(procId);<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        break;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      case DELETE:<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        if (subProcIds != null &amp;&amp; subProcIds.length &gt; 0) {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>          storeTracker.delete(subProcIds);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>          holdingCleanupTracker.setDeletedIfSet(subProcIds);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        } else {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>          storeTracker.delete(procId);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        break;<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      default:<a name="line.754"></a>
-<span class="sourceLineNo">755</span>        throw new RuntimeException("invalid push type " + type);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    }<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  }<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>  private boolean isSyncAborted() {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    return syncException.get() != null;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>  private void syncLoop() throws Throwable {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    long totalSyncedToStore = 0;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    inSync.set(false);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    lock.lock();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    try {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      while (isRunning()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        try {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>          // Wait until new data is available<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          if (slotIndex == 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>            if (!loading.get()) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>              periodicRoll();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>            }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>            if (LOG.isTraceEnabled()) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>              float rollTsSec = getMillisFromLastRoll() / 1000.0f;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>              LOG.trace(String.format("Waiting for data. flushed=%s (%s/sec)",<a name="line.778"></a>
-<span class="sourceLineNo">779</span>                        StringUtils.humanSize(totalSynced.get()),<a name="line.779"></a>
-<span class="sourceLineNo">780</span>                        StringUtils.humanSize(totalSynced.get() / rollTsSec)));<a name="line.780"></a>
-<span class="sourceLineNo">781</span>            }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>            waitCond.await(getMillisToNextPeriodicRoll(), TimeUnit.MILLISECONDS);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>            if (slotIndex == 0) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>              // no data.. probably a stop() or a periodic roll<a name="line.785"></a>
-<span class="sourceLineNo">786</span>              continue;<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>          // Wait SYNC_WAIT_MSEC or the signal of "slots full" before flushing<a name="line.789"></a>
-<span class="sourceLineNo">790</span>          syncMaxSlot = runningProcCount;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>          assert syncMaxSlot &gt; 0 : "unexpected syncMaxSlot=" + syncMaxSlot;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>          final long syncWaitSt = System.currentTimeMillis();<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          if (slotIndex != syncMaxSlot) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>            slotCond.await(syncWaitMsec, TimeUnit.MILLISECONDS);<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>          final long currentTs = System.currentTimeMillis();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>          final long syncWaitMs = currentTs - syncWaitSt;<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          final float rollSec = getMillisFromLastRoll() / 1000.0f;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          final float syncedPerSec = totalSyncedToStore / rollSec;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          if (LOG.isTraceEnabled() &amp;&amp; (syncWaitMs &gt; 10 || slotIndex &lt; syncMaxSlot)) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>            LOG.trace(String.format("Sync wait %s, slotIndex=%s , totalSynced=%s (%s/sec)",<a name="line.802"></a>
-<span class="sourceLineNo">803</span>                      StringUtils.humanTimeDiff(syncWaitMs), slotIndex,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>                      StringUtils.humanSize(totalSyncedToStore),<a name="line.804"></a>
-<span class="sourceLineNo">805</span>                      StringUtils.humanSize(syncedPerSec)));<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>          // update webui circular buffers (TODO: get rid of allocations)<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          final SyncMetrics syncMetrics = new SyncMetrics();<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          syncMetrics.timestamp = currentTs;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          syncMetrics.syncWaitMs = syncWaitMs;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          syncMetrics.syncedEntries = slotIndex;<a name="line.812"></a>
-<span class="sourceLineNo">813</span>          syncMetrics.totalSyncedBytes = totalSyncedToStore;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          syncMetrics.syncedPerSec = syncedPerSec;<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          syncMetricsQueue.add(syncMetrics);<a name="line.815"></a>
-<span class="sourceLineNo">816</span><a name="line.816"></a>
-<span class="sourceLineNo">817</span>          // sync<a name="line.817"></a>
-<span class="sourceLineNo">818</span>          inSync.set(true);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>          long slotSize = syncSlots();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          logs.getLast().addToSize(slotSize);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>          totalSyncedToStore = totalSynced.addAndGet(slotSize);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>          slotIndex = 0;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>          inSync.set(false);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>          syncId.incrementAndGet();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>        } catch (InterruptedException e) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>          Thread.currentThread().interrupt();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>          syncException.compareAndSet(null, e);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>          sendAbortProcessSignal();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          throw e;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        } catch (Throwable t) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          syncException.compareAndSet(null, t);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          sendAbortProcessSignal();<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          throw t;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        } finally {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          syncCond.signalAll();<a name="line.835"></a>
-<span class="sourceLineNo">836</span>        }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    } finally {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      lock.unlock();<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>  public ArrayList&lt;SyncMetrics&gt; getSyncMetrics() {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    lock.lock();<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    try {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      return new ArrayList&lt;&gt;(syncMetricsQueue);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    } finally {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      lock.unlock();<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>  private long syncSlots() throws Throwable {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    int retry = 0;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    int logRolled = 0;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    long totalSynced = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    do {<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      try {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        totalSynced = syncSlots(stream, slots, 0, slotIndex);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        break;<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      } catch (Throwable e) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>        LOG.warn("unable to sync slots, retry=" + retry);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        if (++retry &gt;= maxRetriesBeforeRoll) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          if (logRolled &gt;= maxSyncFailureRoll &amp;&amp; isRunning()) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            LOG.error("Sync slots after log roll failed, abort.", e);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>            throw e;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>          }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!rollWriterWithRetries()) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            throw e;<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>          logRolled++;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>          retry = 0;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>        }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      }<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    } while (isRunning());<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    return totalSynced;<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>  protected long syncSlots(final FSDataOutputStream stream, final ByteSlot[] slots,<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      final int offset, final int count) throws IOException {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    long totalSynced = 0;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    for (int i = 0; i &lt; count; ++i) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final ByteSlot data = slots[offset + i];<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      data.writeTo(stream);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      totalSynced += data.size();<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    syncStream(stream);<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    sendPostSyncSignal();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    if (LOG.isTraceEnabled()) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      LOG.trace("Sync slots=" + count + '/' + syncMaxSlot +<a name="line.893"></a>
-<span class="sourceLineNo">894</span>                ", flushed=" + StringUtils.humanSize(totalSynced));<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    return totalSynced;<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>  protected void syncStream(final FSDataOutputStream stream) throws IOException {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (useHsync) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      stream.hsync();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    } else {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      stream.hflush();<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>  private boolean rollWriterWithRetries() {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    for (int i = 0; i &lt; rollRetries &amp;&amp; isRunning(); ++i) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      if (i &gt; 0) Threads.sleepWithoutInterrupt(waitBeforeRoll * i);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>      try {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        if (rollWriter()) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>          return true;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        }<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      } catch (IOException e) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        LOG.warn("Unable to roll the log, attempt=" + (i + 1), e);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    LOG.error(HBaseMarkers.FATAL, "Unable to roll the log");<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    return false;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>  }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>  private boolean tryRollWriter() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    try {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      return rollWriter();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    } catch (IOException e) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      LOG.warn("Unable to roll the log", e);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return false;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  }<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>  public long getMillisToNextPeriodicRoll() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    if (lastRollTs.get() &gt; 0 &amp;&amp; periodicRollMsec &gt; 0) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return periodicRollMsec - getMillisFromLastRoll();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    return Long.MAX_VALUE;<a name="line.936"></a>
-<span class="sourceLineNo">937</span>  }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>  public long getMillisFromLastRoll() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    return (System.currentTimeMillis() - lastRollTs.get());<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>  @VisibleForTesting<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  protected void periodicRollForTesting() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    lock.lock();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    try {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      periodicRoll();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      lock.unlock();<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>  @VisibleForTesting<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  protected boolean rollWriterForTesting() throws IOException {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    lock.lock();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    try {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      return rollWriter();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    } finally {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      lock.unlock();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    }<a name="line.960"></a>
-<span class="sourceLineNo">961</span>  }<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>  @VisibleForTesting<a name="line.963"></a>
-<span class="sourceLineNo">964</span>  protected void removeInactiveLogsForTesting() throws Exception {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    lock.lock();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    try {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      removeInactiveLogs();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    } finally  {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      lock.unlock();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  private void periodicRoll() throws IOException {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    if (storeTracker.isEmpty()) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (LOG.isTraceEnabled()) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        LOG.trace("no active procedures");<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      tryRollWriter();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      removeAllLogs(flushLogId - 1);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    } else {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      if (storeTracker.isUpdated()) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        if (LOG.isTraceEnabled()) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          LOG.trace("all the active procedures are in the latest log");<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        }<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        removeAllLogs(flushLogId - 1);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>      // if the log size has exceeded the roll threshold<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      // or the periodic roll timeout is expired, try to roll the wal.<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      if (totalSynced.get() &gt; rollThreshold || getMillisToNextPeriodicRoll() &lt;= 0) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        tryRollWriter();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span><a name="line.993"></a>
-<span class="sourceLineNo">994</span>      removeInactiveLogs();<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>  private boolean rollWriter() throws IOException {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    if (!isRunning()) return false;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span><a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    // Create new state-log<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    if (!rollWriter(flushLogId + 1)) {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      LOG.warn("someone else has already created log " + flushLogId);<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      return false;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    }<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span><a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    // We have the lease on the log,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    // but we should check if someone else has created new files<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (getMaxLogId(getLogFiles()) &gt; flushLogId) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.warn("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      logs.getLast().removeFile(this.walArchiveDir);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      return false;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    }<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    // We have the lease on the log<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    return true;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>  @VisibleForTesting<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  boolean rollWriter(final long logId) throws IOException {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    assert logId &gt; flushLogId : "logId=" + logId + " flushLogId=" + flushLogId;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    assert lock.isHeldByCurrentThread() : "expected to be the lock owner. " + lock.isLocked();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    ProcedureWALHeader header = ProcedureWALHeader.newBuilder()<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      .setVersion(ProcedureWALFormat.HEADER_VERSION)<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      .setType(ProcedureWALFormat.LOG_TYPE_STREAM)<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      .setMinProcId(storeTracker.getActiveMinProcId())<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      .setLogId(logId)<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      .build();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    FSDataOutputStream newStream = null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    Path newLogFile = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    long startPos = -1;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    newLogFile = getLogFilePath(logId);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    try {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      newStream = CommonFSUtils.createForWal(fs, newLogFile, false);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (FileAlreadyExistsException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      LOG.error("Log file with id=" + logId + " already exists", e);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return false;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } catch (RemoteException re) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      LOG.warn("failed to create log file with id=" + logId, re);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      return false;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    }<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    // After we create the stream but before we attempt to use it at all<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    // ensure that we can provide the level of data safety we're configured<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    // to provide.<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    final String durability = useHsync ? "hsync" : "hflush";<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (enforceStreamCapability &amp;&amp; !(CommonFSUtils.hasCapability(newStream, durability))) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        throw new IllegalStateException("The procedure WAL relies on the ability to " + durability +<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          " for proper operation during component failures, but the underlying filesystem does " +<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          "not support doing so. Please check the config value of '" + USE_HSYNC_CONF_KEY +<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>          "' to set the desired level of robustness and ensure the config value of '" +<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>          CommonFSUtils.HBASE_WAL_DIR + "' points to a FileSystem mount that can provide it.");<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    try {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      ProcedureWALFormat.writeHeader(newStream, header);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      startPos = newStream.getPos();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    } catch (IOException ioe) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      LOG.warn("Encountered exception writing header", ioe);<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      newStream.close();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    closeCurrentLogStream();<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span><a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    storeTracker.resetUpdates();<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    stream = newStream;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    flushLogId = logId;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    totalSynced.set(0);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    long rollTs = System.currentTimeMillis();<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    lastRollTs.set(rollTs);<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    logs.add(new ProcedureWALFile(fs, newLogFile, header, startPos, rollTs));<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // if it's the first next WAL being added, build the holding cleanup tracker<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    if (logs.size() == 2) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      buildHoldingCleanupTracker();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    } else if (logs.size() &gt; walCountWarnThreshold) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      LOG.warn("procedure WALs count=" + logs.size() +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        " above the warning threshold " + walCountWarnThreshold +<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        ". check running procedures to see if something is stuck.");<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span><a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    LOG.info("Rolled new Procedure Store WAL, id={}", logId);<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>    return true;<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>  }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  private void closeCurrentLogStream() {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    if (stream == null || logs.isEmpty()) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      return;<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>    try {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      ProcedureWALFile log = logs.getLast();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      log.setProcIds(storeTracker.getUpdatedMinProcId(), storeTracker.getUpdatedMaxProcId());<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      log.updateLocalTracker(storeTracker);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      long trailerSize = ProcedureWALFormat.writeTrailer(stream, storeTracker);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      log.addToSize(trailerSize);<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (IOException e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.warn("Unable to write the trailer: " + e.getMessage());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    try {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      stream.close();<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    } catch (IOException e) {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      LOG.error("Unable to close the stream", e);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    stream = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  // ==========================================================================<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  //  Log Files cleaner helpers<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  // ==========================================================================<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  private void removeInactiveLogs() throws IOException {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    // We keep track of which procedures are holding the oldest WAL in 'holdingCleanupTracker'.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    // once there is nothing olding the oldest WAL we can remove it.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    while (logs.size() &gt; 1 &amp;&amp; holdingCleanupTracker.isEmpty()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      removeLogFile(logs.getFirst(), walArchiveDir);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      buildHoldingCleanupTracker();<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span><a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    // TODO: In case we are holding up a lot of logs for long time we should<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    // rewrite old procedures (in theory parent procs) to the new WAL.<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  private void buildHoldingCleanupTracker() {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (logs.size() &lt;= 1) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      // we only have one wal, so nothing to do<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      holdingCleanupTracker.reset();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span><a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    // compute the holding tracker.<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    //  - the first WAL is used for the 'updates'<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    //  - the other WALs are scanned to remove procs already in other wals.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    // TODO: exit early if holdingCleanupTracker.isEmpty()<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    holdingCleanupTracker.resetTo(logs.getFirst().getTracker(), true);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    holdingCleanupTracker.setDeletedIfSet(storeTracker);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    for (int i = 1, size = logs.size() - 1; i &lt; size; ++i) {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      holdingCleanupTracker.setDeletedIfSet(logs.get(i).getTracker());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<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>  /**<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * Remove all logs with logId &lt;= {@code lastLogId}.<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   */<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  private void removeAllLogs(long lastLogId) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    if (logs.size() &lt;= 1) return;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    if (LOG.isTraceEnabled()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      LOG.trace("Remove all state logs with ID less than " + lastLogId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span><a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    boolean removed = false;<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    while (logs.size() &gt; 1) {<a name="line.1153">

<TRUNCATED>

[47/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index f1f36a4..fa81722 100644
--- a/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/apidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -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.1112">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1114">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.1125">addOptions</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1127">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.1140">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.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>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
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 7d49582..01861a7 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 780c40c..67fdd2a 100644
--- a/book.html
+++ b/book.html
@@ -4478,6 +4478,21 @@ Some configurations would only appear in source code; the only way to identify t
 </dd>
 </dl>
 </div>
+<div id="hbase.snapshot.working.dir" class="dlist">
+<dl>
+<dt class="hdlist1"><code>hbase.snapshot.working.dir</code></dt>
+<dd>
+<div class="paragraph">
+<div class="title">Description</div>
+<p>Location where the snapshotting process will occur. The location of the completed snapshots will not change, but the temporary directory where the snapshot process occurs will be set to this location. This can be a separate filesystem than the root directory, for performance increase purposes. See HBASE-21098 for more information</p>
+</div>
+<div class="paragraph">
+<div class="title">Default</div>
+<p>none</p>
+</div>
+</dd>
+</dl>
+</div>
 <div id="hbase.server.compactchecker.interval.multiplier" class="dlist">
 <dl>
 <dt class="hdlist1"><code>hbase.server.compactchecker.interval.multiplier</code></dt>
@@ -41269,7 +41284,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 2018-09-11 14:32:07 UTC
+Last updated 2018-09-12 14:33:08 UTC
 </div>
 </div>
 </body>

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


[13/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.AtomicOperation.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  pr

<TRUNCATED>

[32/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
index bbf8130..566f410 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -4276,7 +4276,7 @@
 <span class="sourceLineNo">4268</span>  public void addRegionToSnapshot(SnapshotDescription desc,<a name="line.4268"></a>
 <span class="sourceLineNo">4269</span>      ForeignExceptionSnare exnSnare) throws IOException {<a name="line.4269"></a>
 <span class="sourceLineNo">4270</span>    Path rootDir = FSUtils.getRootDir(conf);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir);<a name="line.4271"></a>
+<span class="sourceLineNo">4271</span>    Path snapshotDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(desc, rootDir, conf);<a name="line.4271"></a>
 <span class="sourceLineNo">4272</span><a name="line.4272"></a>
 <span class="sourceLineNo">4273</span>    SnapshotManifest manifest = SnapshotManifest.create(conf, getFilesystem(),<a name="line.4273"></a>
 <span class="sourceLineNo">4274</span>            snapshotDir, desc, exnSnare);<a name="line.4274"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/rest/TableResource.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rest/TableResource.html b/devapidocs/src-html/org/apache/hadoop/hbase/rest/TableResource.html
index bc30f9d..27a6676 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/rest/TableResource.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/rest/TableResource.html
@@ -35,185 +35,181 @@
 <span class="sourceLineNo">027</span>import javax.ws.rs.PathParam;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import javax.ws.rs.QueryParam;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import org.apache.commons.lang3.StringUtils;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.TableName;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.slf4j.Logger;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.slf4j.LoggerFactory;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Table;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.filter.ParseFilter;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>@InterfaceAudience.Private<a name="line.42"></a>
-<span class="sourceLineNo">043</span>public class TableResource extends ResourceBase {<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>  String table;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>  private static final Logger LOG = LoggerFactory.getLogger(TableResource.class);<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>  /**<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   * Constructor<a name="line.49"></a>
-<span class="sourceLineNo">050</span>   * @param table<a name="line.50"></a>
-<span class="sourceLineNo">051</span>   * @throws IOException<a name="line.51"></a>
-<span class="sourceLineNo">052</span>   */<a name="line.52"></a>
-<span class="sourceLineNo">053</span>  public TableResource(String table) throws IOException {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    super();<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    this.table = table;<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>  /** @return the table name */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  String getName() {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    return table;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  /**<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * @return true if the table exists<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * @throws IOException<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  boolean exists() throws IOException {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    return servlet.getAdmin().tableExists(TableName.valueOf(table));<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>  @Path("exists")<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  public ExistsResource getExistsResource() throws IOException {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    return new ExistsResource(this);<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @Path("regions")<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public RegionsResource getRegionsResource() throws IOException {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    return new RegionsResource(this);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  }<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  @Path("scanner")<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public ScannerResource getScannerResource() throws IOException {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    return new ScannerResource(this);<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>  @Path("schema")<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public SchemaResource getSchemaResource() throws IOException {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    return new SchemaResource(this);<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>  @Path("{multiget: multiget.*}")<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  public MultiRowResource getMultipleRowResource(final @QueryParam("v") String versions,<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      @PathParam("multiget") String path) throws IOException {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    return new MultiRowResource(this, versions, path.replace("multiget", "").replace("/", ""));<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  @Path("{rowspec: [^*]+}")<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public RowResource getRowResource(<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      // We need the @Encoded decorator so Jersey won't urldecode before<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      // the RowSpec constructor has a chance to parse<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      final @PathParam("rowspec") @Encoded String rowspec,<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      final @QueryParam("v") String versions,<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      final @QueryParam("check") String check,<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      final @QueryParam("rr") String returnResult) throws IOException {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    return new RowResource(this, rowspec, versions, check, returnResult);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Path("{suffixglobbingspec: .*\\*/.+}")<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public RowResource getRowResourceWithSuffixGlobbing(<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      // We need the @Encoded decorator so Jersey won't urldecode before<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      // the RowSpec constructor has a chance to parse<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      final @PathParam("suffixglobbingspec") @Encoded String suffixglobbingspec,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      final @QueryParam("v") String versions,<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      final @QueryParam("check") String check,<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      final @QueryParam("rr") String returnResult) throws IOException {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return new RowResource(this, suffixglobbingspec, versions, check, returnResult);<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>  @Path("{scanspec: .*[*]$}")<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public TableScanResource  getScanResource(<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      final @PathParam("scanspec") String scanSpec,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      @DefaultValue(Integer.MAX_VALUE + "")<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      @QueryParam(Constants.SCAN_LIMIT) int userRequestedLimit,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      @DefaultValue("") @QueryParam(Constants.SCAN_START_ROW) String startRow,<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      @DefaultValue("") @QueryParam(Constants.SCAN_END_ROW) String endRow,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      @DefaultValue("") @QueryParam(Constants.SCAN_COLUMN) List&lt;String&gt; column,<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      @DefaultValue("1") @QueryParam(Constants.SCAN_MAX_VERSIONS) int maxVersions,<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      @DefaultValue("-1") @QueryParam(Constants.SCAN_BATCH_SIZE) int batchSize,<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      @DefaultValue("0") @QueryParam(Constants.SCAN_START_TIME) long startTime,<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      @DefaultValue(Long.MAX_VALUE + "") @QueryParam(Constants.SCAN_END_TIME) long endTime,<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      @DefaultValue("true") @QueryParam(Constants.SCAN_CACHE_BLOCKS) boolean cacheBlocks,<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      @DefaultValue("false") @QueryParam(Constants.SCAN_REVERSED) boolean reversed,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      @DefaultValue("") @QueryParam(Constants.SCAN_FILTER) String paramFilter) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    try {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      Filter prefixFilter = null;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      Scan tableScan = new Scan();<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      if (scanSpec.indexOf('*') &gt; 0) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        String prefix = scanSpec.substring(0, scanSpec.indexOf('*'));<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        byte[] prefixBytes = Bytes.toBytes(prefix);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        prefixFilter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        if (startRow.isEmpty()) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          tableScan.setStartRow(prefixBytes);<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>      if (LOG.isTraceEnabled()) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>        LOG.trace("Query parameters  : Table Name = &gt; " + this.table + " Start Row =&gt; " + startRow<a name="line.146"></a>
-<span class="sourceLineNo">147</span>            + " End Row =&gt; " + endRow + " Columns =&gt; " + column + " Start Time =&gt; " + startTime<a name="line.147"></a>
-<span class="sourceLineNo">148</span>            + " End Time =&gt; " + endTime + " Cache Blocks =&gt; " + cacheBlocks + " Max Versions =&gt; "<a name="line.148"></a>
-<span class="sourceLineNo">149</span>            + maxVersions + " Batch Size =&gt; " + batchSize);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      Table hTable = RESTServlet.getInstance().getTable(this.table);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      tableScan.setBatch(batchSize);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      tableScan.setMaxVersions(maxVersions);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      tableScan.setTimeRange(startTime, endTime);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      if (!startRow.isEmpty()) {<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        tableScan.setStartRow(Bytes.toBytes(startRow));<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      }<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      tableScan.setStopRow(Bytes.toBytes(endRow));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      for (String csplit : column) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        String[] familysplit = csplit.trim().split(":");<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        if (familysplit.length == 2) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>          if (familysplit[1].length() &gt; 0) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>            if (LOG.isTraceEnabled()) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>              LOG.trace("Scan family and column : " + familysplit[0] + "  " + familysplit[1]);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>            }<a name="line.165"></a>
-<span class="sourceLineNo">166</span>            tableScan.addColumn(Bytes.toBytes(familysplit[0]), Bytes.toBytes(familysplit[1]));<a name="line.166"></a>
-<span class="sourceLineNo">167</span>          } else {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>            tableScan.addFamily(Bytes.toBytes(familysplit[0]));<a name="line.168"></a>
-<span class="sourceLineNo">169</span>            if (LOG.isTraceEnabled()) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>              LOG.trace("Scan family : " + familysplit[0] + " and empty qualifier.");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>            }<a name="line.171"></a>
-<span class="sourceLineNo">172</span>            tableScan.addColumn(Bytes.toBytes(familysplit[0]), null);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>          }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        } else if (StringUtils.isNotEmpty(familysplit[0])) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>          if (LOG.isTraceEnabled()) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>            LOG.trace("Scan family : " + familysplit[0]);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>          }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>          tableScan.addFamily(Bytes.toBytes(familysplit[0]));<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>      FilterList filterList = new FilterList();<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      if (StringUtils.isNotEmpty(paramFilter)) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        ParseFilter pf = new ParseFilter();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        Filter parsedParamFilter = pf.parseFilterString(paramFilter);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        if (parsedParamFilter != null) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          filterList.addFilter(parsedParamFilter);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        if (prefixFilter != null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>          filterList.addFilter(prefixFilter);<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>      if (filterList.size() &gt; 0) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        tableScan.setFilter(filterList);<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>      int fetchSize = this.servlet.getConfiguration().getInt(Constants.SCAN_FETCH_SIZE, 10);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      tableScan.setCaching(fetchSize);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      tableScan.setReversed(reversed);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      tableScan.setCacheBlocks(cacheBlocks);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      return new TableScanResource(hTable.getScanner(tableScan), userRequestedLimit);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    } catch (IOException exp) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      servlet.getMetrics().incrementFailedScanRequests(1);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      processException(exp);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      LOG.warn(exp.toString(), exp);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return null;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>}<a name="line.208"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.TableName;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.slf4j.Logger;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.slf4j.LoggerFactory;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.Table;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.filter.ParseFilter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>@InterfaceAudience.Private<a name="line.43"></a>
+<span class="sourceLineNo">044</span>public class TableResource extends ResourceBase {<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  String table;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  private static final Logger LOG = LoggerFactory.getLogger(TableResource.class);<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>  /**<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   * Constructor<a name="line.50"></a>
+<span class="sourceLineNo">051</span>   * @param table<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   * @throws IOException<a name="line.52"></a>
+<span class="sourceLineNo">053</span>   */<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  public TableResource(String table) throws IOException {<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    super();<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    this.table = table;<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>  /** @return the table name */<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  String getName() {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    return table;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * @return true if the table exists<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @throws IOException<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  boolean exists() throws IOException {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    return servlet.getAdmin().tableExists(TableName.valueOf(table));<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>  @Path("exists")<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public ExistsResource getExistsResource() throws IOException {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    return new ExistsResource(this);<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  @Path("regions")<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public RegionsResource getRegionsResource() throws IOException {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    return new RegionsResource(this);<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>  @Path("scanner")<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public ScannerResource getScannerResource() throws IOException {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    return new ScannerResource(this);<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>  @Path("schema")<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public SchemaResource getSchemaResource() throws IOException {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    return new SchemaResource(this);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  }<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  @Path("{multiget: multiget.*}")<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  public MultiRowResource getMultipleRowResource(final @QueryParam("v") String versions,<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      @PathParam("multiget") String path) throws IOException {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    return new MultiRowResource(this, versions, path.replace("multiget", "").replace("/", ""));<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>  @Path("{rowspec: [^*]+}")<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  public RowResource getRowResource(<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      // We need the @Encoded decorator so Jersey won't urldecode before<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      // the RowSpec constructor has a chance to parse<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      final @PathParam("rowspec") @Encoded String rowspec,<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      final @QueryParam("v") String versions,<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      final @QueryParam("check") String check,<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      final @QueryParam("rr") String returnResult) throws IOException {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    return new RowResource(this, rowspec, versions, check, returnResult);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Path("{suffixglobbingspec: .*\\*/.+}")<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public RowResource getRowResourceWithSuffixGlobbing(<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      // We need the @Encoded decorator so Jersey won't urldecode before<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      // the RowSpec constructor has a chance to parse<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      final @PathParam("suffixglobbingspec") @Encoded String suffixglobbingspec,<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      final @QueryParam("v") String versions,<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      final @QueryParam("check") String check,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      final @QueryParam("rr") String returnResult) throws IOException {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    return new RowResource(this, suffixglobbingspec, versions, check, returnResult);<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>  @Path("{scanspec: .*[*]$}")<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public TableScanResource  getScanResource(<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      final @PathParam("scanspec") String scanSpec,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      @DefaultValue(Integer.MAX_VALUE + "")<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      @QueryParam(Constants.SCAN_LIMIT) int userRequestedLimit,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      @DefaultValue("") @QueryParam(Constants.SCAN_START_ROW) String startRow,<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      @DefaultValue("") @QueryParam(Constants.SCAN_END_ROW) String endRow,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      @QueryParam(Constants.SCAN_COLUMN) List&lt;String&gt; column,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      @DefaultValue("1") @QueryParam(Constants.SCAN_MAX_VERSIONS) int maxVersions,<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      @DefaultValue("-1") @QueryParam(Constants.SCAN_BATCH_SIZE) int batchSize,<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      @DefaultValue("0") @QueryParam(Constants.SCAN_START_TIME) long startTime,<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      @DefaultValue(Long.MAX_VALUE + "") @QueryParam(Constants.SCAN_END_TIME) long endTime,<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      @DefaultValue("true") @QueryParam(Constants.SCAN_CACHE_BLOCKS) boolean cacheBlocks,<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      @DefaultValue("false") @QueryParam(Constants.SCAN_REVERSED) boolean reversed,<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      @DefaultValue("") @QueryParam(Constants.SCAN_FILTER) String paramFilter) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    try {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      Filter prefixFilter = null;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      Scan tableScan = new Scan();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if (scanSpec.indexOf('*') &gt; 0) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        String prefix = scanSpec.substring(0, scanSpec.indexOf('*'));<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        byte[] prefixBytes = Bytes.toBytes(prefix);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        prefixFilter = new PrefixFilter(Bytes.toBytes(prefix));<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        if (startRow.isEmpty()) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>          tableScan.setStartRow(prefixBytes);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        }<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      if (LOG.isTraceEnabled()) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        LOG.trace("Query parameters  : Table Name = &gt; " + this.table + " Start Row =&gt; " + startRow<a name="line.147"></a>
+<span class="sourceLineNo">148</span>            + " End Row =&gt; " + endRow + " Columns =&gt; " + column + " Start Time =&gt; " + startTime<a name="line.148"></a>
+<span class="sourceLineNo">149</span>            + " End Time =&gt; " + endTime + " Cache Blocks =&gt; " + cacheBlocks + " Max Versions =&gt; "<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            + maxVersions + " Batch Size =&gt; " + batchSize);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      Table hTable = RESTServlet.getInstance().getTable(this.table);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      tableScan.setBatch(batchSize);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      tableScan.setMaxVersions(maxVersions);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      tableScan.setTimeRange(startTime, endTime);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (!startRow.isEmpty()) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>        tableScan.setStartRow(Bytes.toBytes(startRow));<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      }<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      tableScan.setStopRow(Bytes.toBytes(endRow));<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      for (String col : column) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        byte [][] parts = CellUtil.parseColumn(Bytes.toBytes(col.trim()));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        if (parts.length == 1) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          if (LOG.isTraceEnabled()) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>            LOG.trace("Scan family : " + Bytes.toStringBinary(parts[0]));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          tableScan.addFamily(parts[0]);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        } else if (parts.length == 2) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          if (LOG.isTraceEnabled()) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>            LOG.trace("Scan family and column : " + Bytes.toStringBinary(parts[0])<a name="line.169"></a>
+<span class="sourceLineNo">170</span>                + "  " + Bytes.toStringBinary(parts[1]));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>          tableScan.addColumn(parts[0], parts[1]);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        } else {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          throw new IllegalArgumentException("Invalid column specifier.");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      }<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      FilterList filterList = new FilterList();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      if (StringUtils.isNotEmpty(paramFilter)) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        ParseFilter pf = new ParseFilter();<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        Filter parsedParamFilter = pf.parseFilterString(paramFilter);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        if (parsedParamFilter != null) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>          filterList.addFilter(parsedParamFilter);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        if (prefixFilter != null) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          filterList.addFilter(prefixFilter);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      if (filterList.size() &gt; 0) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        tableScan.setFilter(filterList);<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>      int fetchSize = this.servlet.getConfiguration().getInt(Constants.SCAN_FETCH_SIZE, 10);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      tableScan.setCaching(fetchSize);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      tableScan.setReversed(reversed);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      tableScan.setCacheBlocks(cacheBlocks);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      return new TableScanResource(hTable.getScanner(tableScan), userRequestedLimit);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    } catch (IOException exp) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      servlet.getMetrics().incrementFailedScanRequests(1);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      processException(exp);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      LOG.warn(exp.toString(), exp);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      return null;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>}<a name="line.204"></a>
 
 
 


[05/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
index 826bcba..5323511 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.ClientSideCellSetModel.Listener.html
@@ -98,580 +98,623 @@
 <span class="sourceLineNo">090</span>  private static final String CFB = "b";<a name="line.90"></a>
 <span class="sourceLineNo">091</span>  private static final String COLUMN_1 = CFA + ":1";<a name="line.91"></a>
 <span class="sourceLineNo">092</span>  private static final String COLUMN_2 = CFB + ":2";<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static Client client;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static int expectedRows1;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static int expectedRows2;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static Configuration conf;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    new HBaseRESTTestingUtility();<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @BeforeClass<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public static void setUpBeforeClass() throws Exception {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    conf = TEST_UTIL.getConfiguration();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    TEST_UTIL.startMiniCluster();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    client = new Client(new Cluster().add("localhost",<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      REST_TEST_UTIL.getServletPort()));<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    if (!admin.tableExists(TABLE)) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    htd.addFamily(new HColumnDescriptor(CFA));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htd.addFamily(new HColumnDescriptor(CFB));<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    admin.createTable(htd);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<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>  @AfterClass<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public static void tearDownAfterClass() throws Exception {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    // Test scanning particular columns<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    StringBuilder builder = new StringBuilder();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    builder.append("/*");<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    builder.append("?");<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    builder.append("&amp;");<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      Constants.MIMETYPE_XML);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    assertEquals(200, response.getCode());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    int count = TestScannerResource.countCellSet(model);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    assertEquals(10, count);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    checkRowsNotNull(model);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>    //Test with no limit.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    builder = new StringBuilder();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    builder.append("/*");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    builder.append("?");<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      Constants.MIMETYPE_XML);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    assertEquals(200, response.getCode());<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    count = TestScannerResource.countCellSet(model);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(expectedRows1, count);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    checkRowsNotNull(model);<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    //Test with start and end row.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    builder = new StringBuilder();<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    builder.append("/*");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    builder.append("?");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    builder.append("&amp;");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    builder.append("&amp;");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Constants.MIMETYPE_XML);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    assertEquals(200, response.getCode());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    count = TestScannerResource.countCellSet(model);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    RowModel startRow = model.getRows().get(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    assertEquals(24, count);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    checkRowsNotNull(model);<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    //Test with start row and limit.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    builder = new StringBuilder();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    builder.append("/*");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    builder.append("?");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    builder.append("&amp;");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    builder.append("&amp;");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      Constants.MIMETYPE_XML);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    assertEquals(200, response.getCode());<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    startRow = model.getRows().get(0);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    count = TestScannerResource.countCellSet(model);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    assertEquals(15, count);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    checkRowsNotNull(model);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    // Test scanning particular columns with limit.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    StringBuilder builder = new StringBuilder();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    builder.append("/*");<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    builder.append("?");<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    builder.append("&amp;");<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      Constants.MIMETYPE_JSON);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    assertEquals(200, response.getCode());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    int count = TestScannerResource.countCellSet(model);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    assertEquals(2, count);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    checkRowsNotNull(model);<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    //Test scanning with no limit.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    builder = new StringBuilder();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    builder.append("/*");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    builder.append("?");<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      Constants.MIMETYPE_JSON);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    assertEquals(200, response.getCode());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    count = TestScannerResource.countCellSet(model);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    assertEquals(expectedRows2, count);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    checkRowsNotNull(model);<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    //Test with start row and end row.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    builder = new StringBuilder();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    builder.append("/*");<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    builder.append("?");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    builder.append("&amp;");<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    builder.append("&amp;");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      Constants.MIMETYPE_JSON);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    assertEquals(200, response.getCode());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    RowModel startRow = model.getRows().get(0);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    count = TestScannerResource.countCellSet(model);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertEquals(24, count);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    checkRowsNotNull(model);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * @throws Exception the exception<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  @Test<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    StringBuilder builder = new StringBuilder();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    builder.append("/*");<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    builder.append("?");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    builder.append("&amp;");<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      Constants.MIMETYPE_XML);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    assertEquals(200, response.getCode());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      CellModel.class);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        assertTrue(row.getKey() != null);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    };<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    });<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // create a new XML parser<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    factory.setNamespaceAware(true);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    reader.parse(new InputSource(response.getStream()));<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  @Test<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public void testStreamingJSON() throws Exception {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    //Test with start row and end row.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    StringBuilder builder = new StringBuilder();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    builder.append("/*");<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    builder.append("?");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    builder.append("&amp;");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    builder.append("&amp;");<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      Constants.MIMETYPE_JSON);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    assertEquals(200, response.getCode());<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    int count = 0;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean found = false;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        assertNotNull(row.getKey());<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          if (count == 0) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          if (count == 23) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.347"></a>
+<span class="sourceLineNo">093</span>  private static final String COLUMN_EMPTY = CFA + ":";<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static Client client;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static int expectedRows1;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private static int expectedRows2;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private static int expectedRows3;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static Configuration conf;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    new HBaseRESTTestingUtility();<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @BeforeClass<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static void setUpBeforeClass() throws Exception {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    conf = TEST_UTIL.getConfiguration();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    TEST_UTIL.startMiniCluster();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    client = new Client(new Cluster().add("localhost",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      REST_TEST_UTIL.getServletPort()));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    if (!admin.tableExists(TABLE)) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      htd.addFamily(new HColumnDescriptor(CFA));<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      htd.addFamily(new HColumnDescriptor(CFB));<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      admin.createTable(htd);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      expectedRows3 = TestScannerResource.insertData(conf, TABLE, COLUMN_EMPTY, 1.0);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @AfterClass<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static void tearDownAfterClass() throws Exception {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  @Test<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Test scanning particular columns<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    StringBuilder builder = new StringBuilder();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    builder.append("/*");<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    builder.append("?");<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    builder.append("&amp;");<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      Constants.MIMETYPE_XML);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    assertEquals(200, response.getCode());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    int count = TestScannerResource.countCellSet(model);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    assertEquals(10, count);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    checkRowsNotNull(model);<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    //Test with no limit.<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    builder = new StringBuilder();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    builder.append("/*");<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    builder.append("?");<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      Constants.MIMETYPE_XML);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertEquals(200, response.getCode());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    count = TestScannerResource.countCellSet(model);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    assertEquals(expectedRows1, count);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    checkRowsNotNull(model);<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    //Test with start and end row.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    builder = new StringBuilder();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    builder.append("/*");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    builder.append("?");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    builder.append("&amp;");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    builder.append("&amp;");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      Constants.MIMETYPE_XML);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    assertEquals(200, response.getCode());<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    count = TestScannerResource.countCellSet(model);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    RowModel startRow = model.getRows().get(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertEquals(24, count);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    checkRowsNotNull(model);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    //Test with start row and limit.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    builder = new StringBuilder();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    builder.append("/*");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    builder.append("?");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    builder.append("&amp;");<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    builder.append("&amp;");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      Constants.MIMETYPE_XML);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    assertEquals(200, response.getCode());<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    startRow = model.getRows().get(0);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    count = TestScannerResource.countCellSet(model);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    assertEquals(15, count);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    checkRowsNotNull(model);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @Test<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Test scanning particular columns with limit.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    StringBuilder builder = new StringBuilder();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    builder.append("/*");<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    builder.append("?");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    builder.append("&amp;");<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      Constants.MIMETYPE_JSON);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    assertEquals(200, response.getCode());<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    int count = TestScannerResource.countCellSet(model);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    assertEquals(2, count);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    checkRowsNotNull(model);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>    //Test scanning with no limit.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    builder = new StringBuilder();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    builder.append("/*");<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    builder.append("?");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      Constants.MIMETYPE_JSON);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    assertEquals(200, response.getCode());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    count = TestScannerResource.countCellSet(model);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    assertEquals(expectedRows2, count);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    checkRowsNotNull(model);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    //Test with start row and end row.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    builder = new StringBuilder();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    builder.append("/*");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    builder.append("?");<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    builder.append("&amp;");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    builder.append("&amp;");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      Constants.MIMETYPE_JSON);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    assertEquals(200, response.getCode());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    RowModel startRow = model.getRows().get(0);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    count = TestScannerResource.countCellSet(model);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    assertEquals(24, count);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    checkRowsNotNull(model);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>  /**<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @throws Exception the exception<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    StringBuilder builder = new StringBuilder();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    builder.append("/*");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    builder.append("?");<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    builder.append("&amp;");<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      Constants.MIMETYPE_XML);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(200, response.getCode());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      CellModel.class);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        assertTrue(row.getKey() != null);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    };<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        @Override<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<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>        @Override<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<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>    });<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // create a new XML parser<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    factory.setNamespaceAware(true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    reader.parse(new InputSource(response.getStream()));<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<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><a name="line.319"></a>
+<span class="sourceLineNo">320</span>  @Test<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  public void testStreamingJSON() throws Exception {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    //Test with start row and end row.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    StringBuilder builder = new StringBuilder();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    builder.append("/*");<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    builder.append("?");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    builder.append("&amp;");<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    builder.append("&amp;");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      Constants.MIMETYPE_JSON);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(200, response.getCode());<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    int count = 0;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean found = false;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        assertNotNull(row.getKey());<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          if (count == 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.347"></a>
 <span class="sourceLineNo">348</span>          }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          count++;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        jParser.skipChildren();<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      } else {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    assertEquals(24, count);<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>  @Test<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    StringBuilder builder = new StringBuilder();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    builder.append("/*");<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    builder.append("?");<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    builder.append("&amp;");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    assertEquals(200, response.getCode());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    assertEquals(15, rowCount);<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>    //Test with start row and end row.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    builder = new StringBuilder();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    builder.append("/*");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    builder.append("?");<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    builder.append("&amp;");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    builder.append("&amp;");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    assertEquals(200, response.getCode());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    rowCount = readProtobufStream(response.getStream());<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    assertEquals(24, rowCount);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private void checkRowsNotNull(CellSetModel model) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    for (RowModel row: model.getRows()) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      assertTrue(row.getKey() != null);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    }<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>   * Read protobuf stream.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * @param inputStream the input stream<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @return The number of rows in the cell set model.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    CellSetModel model = null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    int rowCount = 0;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    try {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      while (true) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        byte[] lengthBytes = new byte[2];<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        int readBytes = stream.read(lengthBytes);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        if (readBytes == -1) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          break;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        assertEquals(2, readBytes);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        int length = Bytes.toShort(lengthBytes);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        byte[] cellset = new byte[length];<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        stream.read(cellset);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        model = new CellSetModel();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        model.getObjectFromMessage(cellset);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        checkRowsNotNull(model);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    } catch (EOFException exp) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      exp.printStackTrace();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    } finally {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      stream.close();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return rowCount;<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>  @Test<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    // Test scanning particular columns with limit.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    StringBuilder builder = new StringBuilder();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    builder.append("/*");<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    builder.append("?");<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      Constants.MIMETYPE_JSON);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    assertEquals(200, response.getCode());<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    int count = TestScannerResource.countCellSet(model);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    assertEquals(0, count);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>  @Test<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public void testSimpleFilter() throws IOException, JAXBException {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    StringBuilder builder = new StringBuilder();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    builder.append("/*");<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    builder.append("?");<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    builder.append("&amp;");<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    builder.append("&amp;");<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    builder.append("&amp;");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("PrefixFilter('aab')", "UTF-8"));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    Response response =<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(200, response.getCode());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    int count = TestScannerResource.countCellSet(model);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    assertEquals(1, count);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    assertEquals("aab",<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testQualifierAndPrefixFilters() throws IOException, JAXBException {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    StringBuilder builder = new StringBuilder();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    builder.append("/abc*");<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    builder.append("?");<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + URLEncoder.encode("QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    Response response =<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    assertEquals(200, response.getCode());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    int count = TestScannerResource.countCellSet(model);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    assertEquals(1, count);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    assertEquals("abc",<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  @Test<a name="line.493"></a>
-<span class="sourceLineNo">494</span>  public void testCompoundFilter() throws IOException, JAXBException {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    StringBuilder builder = new StringBuilder();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    builder.append("/*");<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    builder.append("?");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        + URLEncoder.encode("PrefixFilter('abc') AND QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    Response response =<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    assertEquals(200, response.getCode());<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    int count = TestScannerResource.countCellSet(model);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assertEquals(1, count);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    assertEquals("abc",<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>  @Test<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  public void testCustomFilter() throws IOException, JAXBException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    StringBuilder builder = new StringBuilder();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    builder.append("/a*");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    builder.append("?");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    builder.append("&amp;");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    Response response =<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertEquals(200, response.getCode());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    int count = TestScannerResource.countCellSet(model);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    assertEquals(1, count);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    assertEquals("abc",<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  @Test<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public void testNegativeCustomFilter() throws IOException, JAXBException {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    StringBuilder builder = new StringBuilder();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    builder.append("/b*");<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    builder.append("?");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    builder.append("&amp;");<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    Response response =<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    assertEquals(200, response.getCode());<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    int count = TestScannerResource.countCellSet(model);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Should return no rows as the filters conflict<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    assertEquals(0, count);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  @Test<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  public void testReversed() throws IOException, JAXBException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    StringBuilder builder = new StringBuilder();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    builder.append("/*");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    builder.append("?");<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    builder.append("&amp;");<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    builder.append("&amp;");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Response response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    assertEquals(200, response.getCode());<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    int count = TestScannerResource.countCellSet(model);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    assertEquals(24, count);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    List&lt;RowModel&gt; rowModels = model.getRows().subList(1, count);<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    //reversed<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    builder = new StringBuilder();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    builder.append("/*");<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    builder.append("?");<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    builder.append("&amp;");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    builder.append(Constants.SCAN_START_ROW + "=aay");<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    builder.append("&amp;");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    builder.append(Constants.SCAN_END_ROW + "=aaa");<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    builder.append("&amp;");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    builder.append(Constants.SCAN_REVERSED + "=true");<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    assertEquals(200, response.getCode());<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    count = TestScannerResource.countCellSet(model);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    assertEquals(24, count);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    List&lt;RowModel&gt; reversedRowModels = model.getRows().subList(1, count);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    Collections.reverse(reversedRowModels);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    assertEquals(rowModels.size(), reversedRowModels.size());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    for (int i = 0; i &lt; rowModels.size(); i++) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      RowModel rowModel = rowModels.get(i);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      RowModel reversedRowModel = reversedRowModels.get(i);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>      assertEquals(new String(rowModel.getKey(), "UTF-8"),<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          new String(reversedRowModel.getKey(), "UTF-8"));<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      assertEquals(new String(rowModel.getCells().get(0).getValue(), "UTF-8"),<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          new String(reversedRowModel.getCells().get(0).getValue(), "UTF-8"));<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>  public static class CustomFilter extends PrefixFilter {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    private byte[] key = null;<a name="line.602"></a>
+<span class="sourceLineNo">349</span>          if (count == 23) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>          count++;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        jParser.skipChildren();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      } else {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<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>    assertEquals(24, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Test<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    StringBuilder builder = new StringBuilder();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    builder.append("/*");<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    builder.append("?");<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    builder.append("&amp;");<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    assertEquals(200, response.getCode());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    assertEquals(15, rowCount);<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    //Test with start row and end row.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    builder = new StringBuilder();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    builder.append("/*");<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    builder.append("?");<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    builder.append("&amp;");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    builder.append("&amp;");<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    assertEquals(200, response.getCode());<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    rowCount = readProtobufStream(response.getStream());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    assertEquals(24, rowCount);<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>  private void checkRowsNotNull(CellSetModel model) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    for (RowModel row: model.getRows()) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      assertTrue(row.getKey() != null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * Read protobuf stream.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   * @param inputStream the input stream<a name="line.403"></a>
+<span class="sourceLineNo">404</span>   * @return The number of rows in the cell set model.<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   */<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    CellSetModel model = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    int rowCount = 0;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      while (true) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        byte[] lengthBytes = new byte[2];<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        int readBytes = stream.read(lengthBytes);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        if (readBytes == -1) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          break;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        assertEquals(2, readBytes);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        int length = Bytes.toShort(lengthBytes);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        byte[] cellset = new byte[length];<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        stream.read(cellset);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        model = new CellSetModel();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        model.getObjectFromMessage(cellset);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        checkRowsNotNull(model);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    } catch (EOFException exp) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      exp.printStackTrace();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      stream.close();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return rowCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  @Test<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // Test scanning particular columns with limit.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    StringBuilder builder = new StringBuilder();<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    builder.append("/*");<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    builder.append("?");<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Constants.MIMETYPE_JSON);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    assertEquals(200, response.getCode());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    int count = TestScannerResource.countCellSet(model);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    assertEquals(0, count);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="li

<TRUNCATED>

[43/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
index 1aaae9e..65251a8 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.69">TakeSnapshotHandler</a>
+public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.73">TakeSnapshotHandler</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/executor/EventHandler.html" title="class in org.apache.hadoop.hbase.executor">EventHandler</a>
 implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a>, <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a></pre>
 <div class="block">A handler for taking snapshots from the master.
@@ -158,33 +158,33 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#finished">finished</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>protected org.apache.hadoop.fs.FileSystem</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#fs">fs</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#htd">htd</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#master">master</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/MetricsSnapshot.html" title="class in org.apache.hadoop.hbase.master">MetricsSnapshot</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#metricsSnapshot">metricsSnapshot</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionDispatcher.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignExceptionDispatcher</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#monitor">monitor</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootDir">rootDir</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected org.apache.hadoop.fs.FileSystem</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#rootFs">rootFs</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>protected org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshot">snapshot</a></span></code>&nbsp;</td>
@@ -221,6 +221,10 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <td class="colFirst"><code>protected org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDir">workingDir</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected org.apache.hadoop.fs.FileSystem</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#workingDirFs">workingDirFs</a></span></code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.executor.EventHandler">
@@ -270,10 +274,11 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a></span>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.FileSystem-">completeSnapshot</a></span>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
                 org.apache.hadoop.fs.Path&nbsp;workingDir,
-                org.apache.hadoop.fs.FileSystem&nbsp;fs)</code>
-<div class="block">Reset the manager to allow another snapshot to proceed</div>
+                org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                org.apache.hadoop.fs.FileSystem&nbsp;workingDirFs)</code>
+<div class="block">Reset the manager to allow another snapshot to proceed.</div>
 </td>
 </tr>
 <tr id="i2" class="altColor">
@@ -385,7 +390,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.71">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.75">LOG</a></pre>
 </li>
 </ul>
 <a name="finished">
@@ -394,7 +399,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>finished</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.73">finished</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.77">finished</a></pre>
 </li>
 </ul>
 <a name="master">
@@ -403,7 +408,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>master</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.76">master</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.80">master</a></pre>
 </li>
 </ul>
 <a name="metricsSnapshot">
@@ -412,7 +417,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>metricsSnapshot</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MetricsSnapshot.html" title="class in org.apache.hadoop.hbase.master">MetricsSnapshot</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.77">metricsSnapshot</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MetricsSnapshot.html" title="class in org.apache.hadoop.hbase.master">MetricsSnapshot</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.81">metricsSnapshot</a></pre>
 </li>
 </ul>
 <a name="snapshot">
@@ -421,7 +426,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>protected final&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.78">snapshot</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.82">snapshot</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -430,16 +435,25 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.79">conf</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.83">conf</a></pre>
 </li>
 </ul>
-<a name="fs">
+<a name="rootFs">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>fs</h4>
-<pre>protected final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.80">fs</a></pre>
+<h4>rootFs</h4>
+<pre>protected final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.84">rootFs</a></pre>
+</li>
+</ul>
+<a name="workingDirFs">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>workingDirFs</h4>
+<pre>protected final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.85">workingDirFs</a></pre>
 </li>
 </ul>
 <a name="rootDir">
@@ -448,7 +462,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>rootDir</h4>
-<pre>protected final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.81">rootDir</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.86">rootDir</a></pre>
 </li>
 </ul>
 <a name="snapshotDir">
@@ -457,7 +471,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotDir</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.82">snapshotDir</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.87">snapshotDir</a></pre>
 </li>
 </ul>
 <a name="workingDir">
@@ -466,7 +480,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>workingDir</h4>
-<pre>protected final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.83">workingDir</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.88">workingDir</a></pre>
 </li>
 </ul>
 <a name="verifier">
@@ -475,7 +489,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>verifier</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html" title="class in org.apache.hadoop.hbase.master.snapshot">MasterSnapshotVerifier</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.84">verifier</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html" title="class in org.apache.hadoop.hbase.master.snapshot">MasterSnapshotVerifier</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.89">verifier</a></pre>
 </li>
 </ul>
 <a name="monitor">
@@ -484,7 +498,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>monitor</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionDispatcher.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignExceptionDispatcher</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.85">monitor</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionDispatcher.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignExceptionDispatcher</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.90">monitor</a></pre>
 </li>
 </ul>
 <a name="tableLock">
@@ -493,7 +507,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>tableLock</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/locking/LockManager.MasterLock.html" title="class in org.apache.hadoop.hbase.master.locking">LockManager.MasterLock</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.86">tableLock</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/locking/LockManager.MasterLock.html" title="class in org.apache.hadoop.hbase.master.locking">LockManager.MasterLock</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.91">tableLock</a></pre>
 </li>
 </ul>
 <a name="status">
@@ -502,7 +516,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>status</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.87">status</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.92">status</a></pre>
 </li>
 </ul>
 <a name="snapshotTable">
@@ -511,7 +525,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotTable</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.88">snapshotTable</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.93">snapshotTable</a></pre>
 </li>
 </ul>
 <a name="snapshotManifest">
@@ -520,7 +534,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotManifest</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.89">snapshotManifest</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotManifest</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.94">snapshotManifest</a></pre>
 </li>
 </ul>
 <a name="snapshotManager">
@@ -529,7 +543,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotManager</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.90">snapshotManager</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.95">snapshotManager</a></pre>
 </li>
 </ul>
 <a name="htd">
@@ -538,7 +552,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockListLast">
 <li class="blockList">
 <h4>htd</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.92">htd</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.97">htd</a></pre>
 </li>
 </ul>
 </li>
@@ -555,13 +569,19 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TakeSnapshotHandler</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.98">TakeSnapshotHandler</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.107">TakeSnapshotHandler</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                            <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices,
-                           <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;snapshotManager)</pre>
+                           <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;snapshotManager)
+                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>snapshot</code> - descriptor of the snapshot to take</dd>
 <dd><code>masterServices</code> - master services provider</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang">IllegalArgumentException</a></code> - if the working snapshot directory set from the
+   configuration is the same as the completed snapshot directory</dd>
+<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 the file system of the working snapshot directory cannot be
+   determined</dd>
 </dl>
 </li>
 </ul>
@@ -579,7 +599,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>loadTableDescriptor</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.127">loadTableDescriptor</a>()
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.141">loadTableDescriptor</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>,
                                             <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>
@@ -595,7 +615,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.138">prepare</a>()
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.152">prepare</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/executor/EventHandler.html#prepare--">EventHandler</a></code></span></div>
 <div class="block">Event handlers should do all the necessary checks in this method (rather than
@@ -619,7 +639,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>process</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.158">process</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.172">process</a>()</pre>
 <div class="block">Execute the core common portions of taking a snapshot. The <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#snapshotRegions-java.util.List-"><code>snapshotRegions(List)</code></a>
  call should get implemented for each snapshot flavor.</div>
 <dl>
@@ -628,23 +648,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 </dl>
 </li>
 </ul>
-<a name="completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">
+<a name="completeSnapshot-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.FileSystem-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>completeSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.245">completeSnapshot</a>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.263">completeSnapshot</a>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
                              org.apache.hadoop.fs.Path&nbsp;workingDir,
-                             org.apache.hadoop.fs.FileSystem&nbsp;fs)
+                             org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                             org.apache.hadoop.fs.FileSystem&nbsp;workingDirFs)
                       throws <a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotCreationException.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotCreationException</a>,
                              <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">Reset the manager to allow another snapshot to proceed</div>
+<div class="block">Reset the manager to allow another snapshot to proceed.
+ Commits the snapshot process by moving the working snapshot
+ to the finalized filepath</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>snapshotDir</code> - final path of the snapshot</dd>
-<dd><code>workingDir</code> - directory where the in progress snapshot was built</dd>
-<dd><code>fs</code> - <code>FileSystem</code> where the snapshot was built</dd>
+<dd><code>snapshotDir</code> - The file path of the completed snapshots</dd>
+<dd><code>workingDir</code> - The file path of the in progress snapshots</dd>
+<dd><code>fs</code> - The file system of the completed snapshots</dd>
+<dd><code>workingDirFs</code> - The file system of the in progress snapshots</dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotCreationException.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotCreationException</a></code> - if the snapshot could not be moved</dd>
 <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> - the filesystem could not be reached</dd>
@@ -657,7 +681,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotRegions</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.259">snapshotRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regions)
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.288">snapshotRegions</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regions)
                                  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>,
                                         org.apache.zookeeper.KeeperException</pre>
 <div class="block">Snapshot the specified regions</div>
@@ -674,7 +698,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotDisabledRegion</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.265">snapshotDisabledRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.294">snapshotDisabledRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
                                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">Take a snapshot of the specified disabled region</div>
 <dl>
@@ -689,7 +713,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>cancel</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.274">cancel</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;why)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.303">cancel</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;why)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html#cancel-java.lang.String-">SnapshotSentinel</a></code></span></div>
 <div class="block">Actively cancel a running snapshot.</div>
 <dl>
@@ -706,7 +730,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>isFinished</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.285">isFinished</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.314">isFinished</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html#isFinished--">SnapshotSentinel</a></code></span></div>
 <div class="block">Check to see if the snapshot is finished, where finished may be success or failure.</div>
 <dl>
@@ -724,7 +748,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompletionTimestamp</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.290">getCompletionTimestamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.319">getCompletionTimestamp</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html#getCompletionTimestamp--">getCompletionTimestamp</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a></code></dd>
@@ -739,7 +763,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshot</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.295">getSnapshot</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.324">getSnapshot</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html#getSnapshot--">getSnapshot</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a></code></dd>
@@ -754,7 +778,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>getExceptionIfFailed</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.300">getExceptionIfFailed</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.329">getExceptionIfFailed</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html#getExceptionIfFailed--">SnapshotSentinel</a></code></span></div>
 <div class="block">Get the exception that caused the snapshot to fail, if the snapshot has failed.</div>
 <dl>
@@ -772,7 +796,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>rethrowExceptionIfFailed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.305">rethrowExceptionIfFailed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.334">rethrowExceptionIfFailed</a>()
                               throws <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html#rethrowExceptionIfFailed--">SnapshotSentinel</a></code></span></div>
 <div class="block">Rethrow the exception returned by <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html#getExceptionIfFailed--"><code>SnapshotSentinel.getExceptionIfFailed()</code></a>.
@@ -791,7 +815,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>rethrowException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.310">rethrowException</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.339">rethrowException</a>()
                       throws <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html#rethrowException--">ForeignExceptionSnare</a></code></span></div>
 <div class="block">Rethrow an exception currently held by the <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling"><code>ForeignExceptionSnare</code></a>. If there is
@@ -810,7 +834,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>hasException</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.315">hasException</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.344">hasException</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html#hasException--">ForeignExceptionSnare</a></code></span></div>
 <div class="block">Non-exceptional form of <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html#rethrowException--"><code>ForeignExceptionSnare.rethrowException()</code></a>. Checks to see if any
  process to which the exception checkers is bound has created an error that
@@ -829,7 +853,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getException</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.320">getException</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.349">getException</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html#getException--">ForeignExceptionSnare</a></code></span></div>
 <div class="block">Get the value of the captured exception.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 9238e86..a0a5c66 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -437,19 +437,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 197029f..891f9e0 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,11 +216,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
index 8a0fa1a..ef51f23 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static enum <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.666">WALProcedureStore.PushType</a>
+<pre>private static enum <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.667">WALProcedureStore.PushType</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&gt;</pre>
 </li>
 </ul>
@@ -213,7 +213,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>INSERT</h4>
-<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.666">INSERT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.667">INSERT</a></pre>
 </li>
 </ul>
 <a name="UPDATE">
@@ -222,7 +222,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>UPDATE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.666">UPDATE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.667">UPDATE</a></pre>
 </li>
 </ul>
 <a name="DELETE">
@@ -231,7 +231,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DELETE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.666">DELETE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.667">DELETE</a></pre>
 </li>
 </ul>
 </li>


[30/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 


[39/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
index 9c02160..80ce868 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/DisabledTableSnapshotHandler.html
@@ -62,72 +62,75 @@
 <span class="sourceLineNo">054</span>  /**<a name="line.54"></a>
 <span class="sourceLineNo">055</span>   * @param snapshot descriptor of the snapshot to take<a name="line.55"></a>
 <span class="sourceLineNo">056</span>   * @param masterServices master services provider<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   */<a name="line.57"></a>
-<span class="sourceLineNo">058</span>  public DisabledTableSnapshotHandler(SnapshotDescription snapshot,<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      final MasterServices masterServices, final SnapshotManager snapshotManager) {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    super(snapshot, masterServices, snapshotManager);<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  @Override<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  public DisabledTableSnapshotHandler prepare() throws Exception {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    return (DisabledTableSnapshotHandler) super.prepare();<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  }<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  // TODO consider parallelizing these operations since they are independent. Right now its just<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  // easier to keep them serial though<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  @Override<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  public void snapshotRegions(List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; regionsAndLocations)<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      throws IOException, KeeperException {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    try {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      // 1. get all the regions hosting this table.<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>      // extract each pair to separate lists<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      Set&lt;RegionInfo&gt; regions = new HashSet&lt;&gt;();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      for (Pair&lt;RegionInfo, ServerName&gt; p : regionsAndLocations) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        // Don't include non-default regions<a name="line.79"></a>
-<span class="sourceLineNo">080</span>        RegionInfo hri = p.getFirst();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        if (RegionReplicaUtil.isDefaultReplica(hri)) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>          regions.add(hri);<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>      // handle the mob files if any.<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      boolean mobEnabled = MobUtils.hasMobColumns(htd);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      if (mobEnabled) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        // snapshot the mob files as a offline region.<a name="line.88"></a>
-<span class="sourceLineNo">089</span>        RegionInfo mobRegionInfo = MobUtils.getMobRegionInfo(htd.getTableName());<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        regions.add(mobRegionInfo);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      }<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>      // 2. for each region, write all the info to disk<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      String msg = "Starting to write region info and WALs for regions for offline snapshot:"<a name="line.94"></a>
-<span class="sourceLineNo">095</span>          + ClientSnapshotDescriptionUtils.toString(snapshot);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      LOG.info(msg);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      status.setStatus(msg);<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>      ThreadPoolExecutor exec = SnapshotManifest.createExecutor(conf, "DisabledTableSnapshot");<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      try {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        ModifyRegionUtils.editRegions(exec, regions, new ModifyRegionUtils.RegionEditTask() {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>          @Override<a name="line.102"></a>
-<span class="sourceLineNo">103</span>          public void editRegion(final RegionInfo regionInfo) throws IOException {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>            snapshotManifest.addRegion(FSUtils.getTableDir(rootDir, snapshotTable), regionInfo);<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>      } finally {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        exec.shutdown();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    } catch (Exception e) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      // make sure we capture the exception to propagate back to the client later<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      String reason = "Failed snapshot " + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.112"></a>
-<span class="sourceLineNo">113</span>          + " due to exception:" + e.getMessage();<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      ForeignException ee = new ForeignException(reason, e);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      monitor.receive(ee);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      status.abort("Snapshot of table: "+ snapshotTable + " failed because " + e.getMessage());<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    } finally {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      LOG.debug("Marking snapshot" + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.118"></a>
-<span class="sourceLineNo">119</span>          + " as finished.");<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>
-<span class="sourceLineNo">122</span>}<a name="line.122"></a>
+<span class="sourceLineNo">057</span>   * @throws IOException if it cannot access the filesystem of the snapshot<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   *         temporary directory<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   */<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  public DisabledTableSnapshotHandler(SnapshotDescription snapshot,<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      final MasterServices masterServices, final SnapshotManager snapshotManager)<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      throws IOException {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    super(snapshot, masterServices, snapshotManager);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
+<span class="sourceLineNo">065</span><a name="line.65"></a>
+<span class="sourceLineNo">066</span>  @Override<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  public DisabledTableSnapshotHandler prepare() throws Exception {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    return (DisabledTableSnapshotHandler) super.prepare();<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>  // TODO consider parallelizing these operations since they are independent. Right now its just<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  // easier to keep them serial though<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  @Override<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  public void snapshotRegions(List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; regionsAndLocations)<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      throws IOException, KeeperException {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    try {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      // 1. get all the regions hosting this table.<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>      // extract each pair to separate lists<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      Set&lt;RegionInfo&gt; regions = new HashSet&lt;&gt;();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      for (Pair&lt;RegionInfo, ServerName&gt; p : regionsAndLocations) {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>        // Don't include non-default regions<a name="line.82"></a>
+<span class="sourceLineNo">083</span>        RegionInfo hri = p.getFirst();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        if (RegionReplicaUtil.isDefaultReplica(hri)) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>          regions.add(hri);<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>      // handle the mob files if any.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      boolean mobEnabled = MobUtils.hasMobColumns(htd);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      if (mobEnabled) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>        // snapshot the mob files as a offline region.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>        RegionInfo mobRegionInfo = MobUtils.getMobRegionInfo(htd.getTableName());<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        regions.add(mobRegionInfo);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      }<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>      // 2. for each region, write all the info to disk<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      String msg = "Starting to write region info and WALs for regions for offline snapshot:"<a name="line.97"></a>
+<span class="sourceLineNo">098</span>          + ClientSnapshotDescriptionUtils.toString(snapshot);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      LOG.info(msg);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      status.setStatus(msg);<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>      ThreadPoolExecutor exec = SnapshotManifest.createExecutor(conf, "DisabledTableSnapshot");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      try {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        ModifyRegionUtils.editRegions(exec, regions, new ModifyRegionUtils.RegionEditTask() {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>          @Override<a name="line.105"></a>
+<span class="sourceLineNo">106</span>          public void editRegion(final RegionInfo regionInfo) throws IOException {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>            snapshotManifest.addRegion(FSUtils.getTableDir(rootDir, snapshotTable), regionInfo);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>          }<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        });<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      } finally {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        exec.shutdown();<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    } catch (Exception e) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      // make sure we capture the exception to propagate back to the client later<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      String reason = "Failed snapshot " + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.115"></a>
+<span class="sourceLineNo">116</span>          + " due to exception:" + e.getMessage();<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      ForeignException ee = new ForeignException(reason, e);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      monitor.receive(ee);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      status.abort("Snapshot of table: "+ snapshotTable + " failed because " + e.getMessage());<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    } finally {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      LOG.debug("Marking snapshot" + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.121"></a>
+<span class="sourceLineNo">122</span>          + " as finished.");<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>}<a name="line.125"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
index 1e51d8f..f1e72ce 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.html
@@ -58,7 +58,7 @@
 <span class="sourceLineNo">050</span>  private final ProcedureCoordinator coordinator;<a name="line.50"></a>
 <span class="sourceLineNo">051</span><a name="line.51"></a>
 <span class="sourceLineNo">052</span>  public EnabledTableSnapshotHandler(SnapshotDescription snapshot, MasterServices master,<a name="line.52"></a>
-<span class="sourceLineNo">053</span>      final SnapshotManager manager) {<a name="line.53"></a>
+<span class="sourceLineNo">053</span>      final SnapshotManager manager) throws IOException {<a name="line.53"></a>
 <span class="sourceLineNo">054</span>    super(snapshot, master, manager);<a name="line.54"></a>
 <span class="sourceLineNo">055</span>    this.coordinator = manager.getCoordinator();<a name="line.55"></a>
 <span class="sourceLineNo">056</span>  }<a name="line.56"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
index 1137d2f..9a3dd7c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.html
@@ -44,64 +44,64 @@
 <span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.36"></a>
 <span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifest;<a name="line.37"></a>
 <span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.snapshot.SnapshotReferenceUtil;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceStability;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest;<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>/**<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * General snapshot verification on the master.<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * &lt;p&gt;<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * This is a light-weight verification mechanism for all the files in a snapshot. It doesn't<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * attempt to verify that the files are exact copies (that would be paramount to taking the<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * snapshot again!), but instead just attempts to ensure that the files match the expected<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * files and are the same length.<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;p&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * Taking an online snapshots can race against other operations and this is an last line of<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * defense.  For example, if meta changes between when snapshots are taken not all regions of a<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * table may be present.  This can be caused by a region split (daughters present on this scan,<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * but snapshot took parent), or move (snapshots only checks lists of region servers, a move could<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * have caused a region to be skipped or done twice).<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;p&gt;<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * Current snapshot files checked:<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * &lt;ol&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * &lt;li&gt;SnapshotDescription is readable&lt;/li&gt;<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;li&gt;Table info is readable&lt;/li&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;li&gt;Regions&lt;/li&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * &lt;/ol&gt;<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;ul&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;li&gt;Matching regions in the snapshot as currently in the table&lt;/li&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * &lt;li&gt;{@link RegionInfo} matches the current and stored regions&lt;/li&gt;<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * &lt;li&gt;All referenced hfiles have valid names&lt;/li&gt;<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * &lt;li&gt;All the hfiles are present (either in .archive directory in the region)&lt;/li&gt;<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;li&gt;All recovered.edits files are present (by name) and have the correct file size&lt;/li&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * &lt;/ul&gt;<a name="line.74"></a>
-<span class="sourceLineNo">075</span> */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>@InterfaceAudience.Private<a name="line.76"></a>
-<span class="sourceLineNo">077</span>@InterfaceStability.Unstable<a name="line.77"></a>
-<span class="sourceLineNo">078</span>public final class MasterSnapshotVerifier {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterSnapshotVerifier.class);<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private SnapshotDescription snapshot;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private FileSystem fs;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private Path rootDir;<a name="line.83"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.yetus.audience.InterfaceStability;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.slf4j.Logger;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.slf4j.LoggerFactory;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotRegionManifest;<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>/**<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * General snapshot verification on the master.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * &lt;p&gt;<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * This is a light-weight verification mechanism for all the files in a snapshot. It doesn't<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * attempt to verify that the files are exact copies (that would be paramount to taking the<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * snapshot again!), but instead just attempts to ensure that the files match the expected<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * files and are the same length.<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;p&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * Taking an online snapshots can race against other operations and this is an last line of<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * defense.  For example, if meta changes between when snapshots are taken not all regions of a<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * table may be present.  This can be caused by a region split (daughters present on this scan,<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * but snapshot took parent), or move (snapshots only checks lists of region servers, a move could<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * have caused a region to be skipped or done twice).<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * Current snapshot files checked:<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;ol&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * &lt;li&gt;SnapshotDescription is readable&lt;/li&gt;<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * &lt;li&gt;Table info is readable&lt;/li&gt;<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;li&gt;Regions&lt;/li&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * &lt;/ol&gt;<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;ul&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * &lt;li&gt;Matching regions in the snapshot as currently in the table&lt;/li&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * &lt;li&gt;{@link RegionInfo} matches the current and stored regions&lt;/li&gt;<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * &lt;li&gt;All referenced hfiles have valid names&lt;/li&gt;<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * &lt;li&gt;All the hfiles are present (either in .archive directory in the region)&lt;/li&gt;<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;li&gt;All recovered.edits files are present (by name) and have the correct file size&lt;/li&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * &lt;/ul&gt;<a name="line.75"></a>
+<span class="sourceLineNo">076</span> */<a name="line.76"></a>
+<span class="sourceLineNo">077</span>@InterfaceAudience.Private<a name="line.77"></a>
+<span class="sourceLineNo">078</span>@InterfaceStability.Unstable<a name="line.78"></a>
+<span class="sourceLineNo">079</span>public final class MasterSnapshotVerifier {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterSnapshotVerifier.class);<a name="line.80"></a>
+<span class="sourceLineNo">081</span><a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private SnapshotDescription snapshot;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private FileSystem workingDirFs;<a name="line.83"></a>
 <span class="sourceLineNo">084</span>  private TableName tableName;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>  private MasterServices services;<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>   * @param services services for the master<a name="line.88"></a>
 <span class="sourceLineNo">089</span>   * @param snapshot snapshot to check<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * @param rootDir root directory of the hbase installation.<a name="line.90"></a>
+<span class="sourceLineNo">090</span>   * @param workingDirFs the file system containing the temporary snapshot information<a name="line.90"></a>
 <span class="sourceLineNo">091</span>   */<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  public MasterSnapshotVerifier(MasterServices services, SnapshotDescription snapshot, Path rootDir) {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    this.fs = services.getMasterFileSystem().getFileSystem();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    this.services = services;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    this.snapshot = snapshot;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    this.rootDir = rootDir;<a name="line.96"></a>
+<span class="sourceLineNo">092</span>  public MasterSnapshotVerifier(MasterServices services,<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      SnapshotDescription snapshot, FileSystem workingDirFs) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    this.workingDirFs = workingDirFs;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    this.services = services;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    this.snapshot = snapshot;<a name="line.96"></a>
 <span class="sourceLineNo">097</span>    this.tableName = TableName.valueOf(snapshot.getTable());<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>
@@ -115,7 +115,7 @@
 <span class="sourceLineNo">107</span>   */<a name="line.107"></a>
 <span class="sourceLineNo">108</span>  public void verifySnapshot(Path snapshotDir, Set&lt;String&gt; snapshotServers)<a name="line.108"></a>
 <span class="sourceLineNo">109</span>      throws CorruptedSnapshotException, IOException {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    SnapshotManifest manifest = SnapshotManifest.open(services.getConfiguration(), fs,<a name="line.110"></a>
+<span class="sourceLineNo">110</span>    SnapshotManifest manifest = SnapshotManifest.open(services.getConfiguration(), workingDirFs,<a name="line.110"></a>
 <span class="sourceLineNo">111</span>                                                      snapshotDir, snapshot);<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    // verify snapshot info matches<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    verifySnapshotDescription(snapshotDir);<a name="line.113"></a>
@@ -132,106 +132,109 @@
 <span class="sourceLineNo">124</span>   * @param snapshotDir snapshot directory to check<a name="line.124"></a>
 <span class="sourceLineNo">125</span>   */<a name="line.125"></a>
 <span class="sourceLineNo">126</span>  private void verifySnapshotDescription(Path snapshotDir) throws CorruptedSnapshotException {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    SnapshotDescription found = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    if (!this.snapshot.equals(found)) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      throw new CorruptedSnapshotException(<a name="line.129"></a>
-<span class="sourceLineNo">130</span>          "Snapshot read (" + found + ") doesn't equal snapshot we ran (" + snapshot + ").",<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          ProtobufUtil.createSnapshotDesc(snapshot));<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><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  /**<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * Check that the table descriptor for the snapshot is a valid table descriptor<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * @param manifest snapshot manifest to inspect<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   */<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private void verifyTableInfo(final SnapshotManifest manifest) throws IOException {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TableDescriptor htd = manifest.getTableDescriptor();<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    if (htd == null) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      throw new CorruptedSnapshotException("Missing Table Descriptor",<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    }<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>    if (!htd.getTableName().getNameAsString().equals(snapshot.getTable())) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      throw new CorruptedSnapshotException(<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          "Invalid Table Descriptor. Expected " + snapshot.getTable() + " name, got "<a name="line.148"></a>
-<span class="sourceLineNo">149</span>              + htd.getTableName().getNameAsString(), ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * Check that all the regions in the snapshot are valid, and accounted for.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * @param manifest snapshot manifest to inspect<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @throws IOException if we can't reach hbase:meta or read the files from the FS<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private void verifyRegions(final SnapshotManifest manifest) throws IOException {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    List&lt;RegionInfo&gt; regions;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    if (TableName.META_TABLE_NAME.equals(tableName)) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      regions = new MetaTableLocator().getMetaRegions(services.getZooKeeper());<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } else {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      regions = MetaTableAccessor.getTableRegions(services.getConnection(), tableName);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    // Remove the non-default regions<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    RegionReplicaUtil.removeNonDefaultRegions(regions);<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    Map&lt;String, SnapshotRegionManifest&gt; regionManifests = manifest.getRegionManifestsMap();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    if (regionManifests == null) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      String msg = "Snapshot " + ClientSnapshotDescriptionUtils.toString(snapshot) + " looks empty";<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      LOG.error(msg);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      throw new CorruptedSnapshotException(msg);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    String errorMsg = "";<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    boolean hasMobStore = false;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    // the mob region is a dummy region, it's not a real region in HBase.<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    // the mob region has a special name, it could be found by the region name.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    if (regionManifests.get(MobUtils.getMobRegionInfo(tableName).getEncodedName()) != null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      hasMobStore = true;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    int realRegionCount = hasMobStore ? regionManifests.size() - 1 : regionManifests.size();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    if (realRegionCount != regions.size()) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      errorMsg = "Regions moved during the snapshot '" +<a name="line.184"></a>
-<span class="sourceLineNo">185</span>                   ClientSnapshotDescriptionUtils.toString(snapshot) + "'. expected=" +<a name="line.185"></a>
-<span class="sourceLineNo">186</span>                   regions.size() + " snapshotted=" + realRegionCount + ".";<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      LOG.error(errorMsg);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>    // Verify RegionInfo<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    for (RegionInfo region : regions) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      SnapshotRegionManifest regionManifest = regionManifests.get(region.getEncodedName());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      if (regionManifest == null) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        // could happen due to a move or split race.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>        String mesg = " No snapshot region directory found for region:" + region;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        if (errorMsg.isEmpty()) errorMsg = mesg;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        LOG.error(mesg);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        continue;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>      verifyRegionInfo(region, regionManifest);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>    if (!errorMsg.isEmpty()) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      throw new CorruptedSnapshotException(errorMsg);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // Verify Snapshot HFiles<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    SnapshotReferenceUtil.verifySnapshot(services.getConfiguration(), fs, manifest);<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>  /**<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * Verify that the regionInfo is valid<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * @param region the region to check<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @param manifest snapshot manifest to inspect<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private void verifyRegionInfo(final RegionInfo region,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    RegionInfo manifestRegionInfo = ProtobufUtil.toRegionInfo(manifest.getRegionInfo());<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (RegionInfo.COMPARATOR.compare(region, manifestRegionInfo) != 0) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      String msg = "Manifest region info " + manifestRegionInfo +<a name="line.221"></a>
-<span class="sourceLineNo">222</span>                   "doesn't match expected region:" + region;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      throw new CorruptedSnapshotException(msg, ProtobufUtil.createSnapshotDesc(snapshot));<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>}<a name="line.226"></a>
+<span class="sourceLineNo">127</span>    SnapshotDescription found = SnapshotDescriptionUtils.readSnapshotInfo(workingDirFs,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        snapshotDir);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (!this.snapshot.equals(found)) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      throw new CorruptedSnapshotException(<a name="line.130"></a>
+<span class="sourceLineNo">131</span>          "Snapshot read (" + found + ") doesn't equal snapshot we ran (" + snapshot + ").",<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Check that the table descriptor for the snapshot is a valid table descriptor<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * @param manifest snapshot manifest to inspect<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private void verifyTableInfo(final SnapshotManifest manifest) throws IOException {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    TableDescriptor htd = manifest.getTableDescriptor();<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    if (htd == null) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      throw new CorruptedSnapshotException("Missing Table Descriptor",<a name="line.143"></a>
+<span class="sourceLineNo">144</span>        ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    if (!htd.getTableName().getNameAsString().equals(snapshot.getTable())) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      throw new CorruptedSnapshotException(<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          "Invalid Table Descriptor. Expected " + snapshot.getTable() + " name, got "<a name="line.149"></a>
+<span class="sourceLineNo">150</span>              + htd.getTableName().getNameAsString(), ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  /**<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Check that all the regions in the snapshot are valid, and accounted for.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param manifest snapshot manifest to inspect<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @throws IOException if we can't reach hbase:meta or read the files from the FS<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private void verifyRegions(final SnapshotManifest manifest) throws IOException {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    List&lt;RegionInfo&gt; regions;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    if (TableName.META_TABLE_NAME.equals(tableName)) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      regions = new MetaTableLocator().getMetaRegions(services.getZooKeeper());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    } else {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      regions = MetaTableAccessor.getTableRegions(services.getConnection(), tableName);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    // Remove the non-default regions<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    RegionReplicaUtil.removeNonDefaultRegions(regions);<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Map&lt;String, SnapshotRegionManifest&gt; regionManifests = manifest.getRegionManifestsMap();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    if (regionManifests == null) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      String msg = "Snapshot " + ClientSnapshotDescriptionUtils.toString(snapshot) + " looks empty";<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      LOG.error(msg);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      throw new CorruptedSnapshotException(msg);<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>    String errorMsg = "";<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    boolean hasMobStore = false;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // the mob region is a dummy region, it's not a real region in HBase.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // the mob region has a special name, it could be found by the region name.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    if (regionManifests.get(MobUtils.getMobRegionInfo(tableName).getEncodedName()) != null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      hasMobStore = true;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    int realRegionCount = hasMobStore ? regionManifests.size() - 1 : regionManifests.size();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    if (realRegionCount != regions.size()) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      errorMsg = "Regions moved during the snapshot '" +<a name="line.185"></a>
+<span class="sourceLineNo">186</span>                   ClientSnapshotDescriptionUtils.toString(snapshot) + "'. expected=" +<a name="line.186"></a>
+<span class="sourceLineNo">187</span>                   regions.size() + " snapshotted=" + realRegionCount + ".";<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      LOG.error(errorMsg);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    }<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>    // Verify RegionInfo<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    for (RegionInfo region : regions) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      SnapshotRegionManifest regionManifest = regionManifests.get(region.getEncodedName());<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      if (regionManifest == null) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        // could happen due to a move or split race.<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        String mesg = " No snapshot region directory found for region:" + region;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        if (errorMsg.isEmpty()) errorMsg = mesg;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        LOG.error(mesg);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        continue;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>      verifyRegionInfo(region, regionManifest);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>    if (!errorMsg.isEmpty()) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      throw new CorruptedSnapshotException(errorMsg);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>    // Verify Snapshot HFiles<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Requires the root directory file system as HFiles are stored in the root directory<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    SnapshotReferenceUtil.verifySnapshot(services.getConfiguration(),<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        FSUtils.getRootDirFileSystem(services.getConfiguration()), manifest);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  /**<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * Verify that the regionInfo is valid<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param region the region to check<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * @param manifest snapshot manifest to inspect<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   */<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  private void verifyRegionInfo(final RegionInfo region,<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    RegionInfo manifestRegionInfo = ProtobufUtil.toRegionInfo(manifest.getRegionInfo());<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    if (RegionInfo.COMPARATOR.compare(region, manifestRegionInfo) != 0) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      String msg = "Manifest region info " + manifestRegionInfo +<a name="line.224"></a>
+<span class="sourceLineNo">225</span>                   "doesn't match expected region:" + region;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      throw new CorruptedSnapshotException(msg, ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
+<span class="sourceLineNo">228</span>  }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>}<a name="line.229"></a>
 
 
 


[11/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.Incrementer.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  private final String f

<TRUNCATED>

[42/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
index 22fcd51..231636d 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":9,"i13":9,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":9,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":9,"i13":9,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":9,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -569,172 +569,176 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#getSyncMetrics--">getSyncMetrics</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i19" class="rowColor">
+<td class="colFirst"><code>(package private) org.apache.hadoop.fs.Path</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#getWalArchiveDir--">getWalArchiveDir</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#getWALDir--">getWALDir</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#initOldLog-org.apache.hadoop.fs.FileStatus-org.apache.hadoop.fs.Path-">initOldLog</a></span>(org.apache.hadoop.fs.FileStatus&nbsp;logFile,
           org.apache.hadoop.fs.Path&nbsp;walArchiveDir)</code>
 <div class="block">Loads given log file and it's tracker.</div>
 </td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#initOldLogs-org.apache.hadoop.fs.FileStatus:A-">initOldLogs</a></span>(org.apache.hadoop.fs.FileStatus[]&nbsp;logFiles)</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#initTrackerFromOldLogs--">initTrackerFromOldLogs</a></span>()</code>
 <div class="block">If last log's tracker is not null, use it as <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#storeTracker"><code>storeTracker</code></a>.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure:A-">insert</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;procs)</code>
 <div class="block">Serialize a set of new procedures.</div>
 </td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">insert</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
       <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;subprocs)</code>
 <div class="block">When a procedure is submitted to the executor insert(proc, null) will be called.</div>
 </td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#isSyncAborted--">isSyncAborted</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#load-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureLoader-">load</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)</code>
 <div class="block">Load the Procedures in the store.</div>
 </td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#main-java.lang.String:A-">main</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>
 <div class="block">Parses a directory of WALs building up ProcedureState.</div>
 </td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#periodicRoll--">periodicRoll</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#periodicRollForTesting--">periodicRollForTesting</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#pushData-org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.PushType-org.apache.hadoop.hbase.procedure2.util.ByteSlot-long-long:A-">pushData</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
         <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot,
         long&nbsp;procId,
         long[]&nbsp;subProcIds)</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#recoverLease--">recoverLease</a></span>()</code>
 <div class="block">Acquire the lease for the procedure store.</div>
 </td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#releaseSlot-org.apache.hadoop.hbase.procedure2.util.ByteSlot-">releaseSlot</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot)</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#removeAllLogs-long-">removeAllLogs</a></span>(long&nbsp;lastLogId)</code>
 <div class="block">Remove all logs with logId <= <code>lastLogId</code>.</div>
 </td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#removeInactiveLogs--">removeInactiveLogs</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#removeInactiveLogsForTesting--">removeInactiveLogsForTesting</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#removeLogFile-org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFile-org.apache.hadoop.fs.Path-">removeLogFile</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&nbsp;log,
              org.apache.hadoop.fs.Path&nbsp;walArchiveDir)</code>&nbsp;</td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#rollWriter--">rollWriter</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#rollWriter-long-">rollWriter</a></span>(long&nbsp;logId)</code>&nbsp;</td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#rollWriterForTesting--">rollWriterForTesting</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#rollWriterWithRetries--">rollWriterWithRetries</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#sendStopSignal--">sendStopSignal</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#setRunningProcedureCount-int-">setRunningProcedureCount</a></span>(int&nbsp;count)</code>
 <div class="block">Set the number of procedure running.</div>
 </td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#start-int-">start</a></span>(int&nbsp;numSlots)</code>
 <div class="block">Start/Open the procedure store</div>
 </td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#stop-boolean-">stop</a></span>(boolean&nbsp;abort)</code>
 <div class="block">Stop/Close the procedure store</div>
 </td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#syncLoop--">syncLoop</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#syncSlots--">syncSlots</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code>protected long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#syncSlots-org.apache.hadoop.fs.FSDataOutputStream-org.apache.hadoop.hbase.procedure2.util.ByteSlot:A-int-int-">syncSlots</a></span>(org.apache.hadoop.fs.FSDataOutputStream&nbsp;stream,
          <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>[]&nbsp;slots,
          int&nbsp;offset,
          int&nbsp;count)</code>&nbsp;</td>
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#syncStream-org.apache.hadoop.fs.FSDataOutputStream-">syncStream</a></span>(org.apache.hadoop.fs.FSDataOutputStream&nbsp;stream)</code>&nbsp;</td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#tryCleanupLogsOnLoad--">tryCleanupLogsOnLoad</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#tryRollWriter--">tryRollWriter</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#update-org.apache.hadoop.hbase.procedure2.Procedure-">update</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</code>
 <div class="block">The specified procedure was executed,
  and the new state should be written to the store.</div>
 </td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#updateStoreTracker-org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.PushType-long-long:A-">updateStoreTracker</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
                   long&nbsp;procId,
@@ -1439,7 +1443,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>WALS_PATH_FILTER</h4>
-<pre>private static final&nbsp;org.apache.hadoop.fs.PathFilter <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1206">WALS_PATH_FILTER</a></pre>
+<pre>private static final&nbsp;org.apache.hadoop.fs.PathFilter <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1212">WALS_PATH_FILTER</a></pre>
 </li>
 </ul>
 <a name="FILE_STATUS_ID_COMPARATOR">
@@ -1448,7 +1452,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FILE_STATUS_ID_COMPARATOR</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;org.apache.hadoop.fs.FileStatus&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1214">FILE_STATUS_ID_COMPARATOR</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;org.apache.hadoop.fs.FileStatus&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1220">FILE_STATUS_ID_COMPARATOR</a></pre>
 </li>
 </ul>
 </li>
@@ -1480,7 +1484,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WALProcedureStore</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.207">WALProcedureStore</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.208">WALProcedureStore</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                          org.apache.hadoop.fs.Path&nbsp;walDir,
                          org.apache.hadoop.fs.Path&nbsp;walArchiveDir,
                          <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a>&nbsp;leaseRecovery)
@@ -1505,7 +1509,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.240">start</a>(int&nbsp;numSlots)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.241">start</a>(int&nbsp;numSlots)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#start-int-">ProcedureStore</a></code></span></div>
 <div class="block">Start/Open the procedure store</div>
@@ -1521,7 +1525,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.290">stop</a>(boolean&nbsp;abort)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.291">stop</a>(boolean&nbsp;abort)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#stop-boolean-">ProcedureStore</a></code></span></div>
 <div class="block">Stop/Close the procedure store</div>
 <dl>
@@ -1536,7 +1540,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>sendStopSignal</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.323">sendStopSignal</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.324">sendStopSignal</a>()</pre>
 </li>
 </ul>
 <a name="getNumThreads--">
@@ -1545,7 +1549,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumThreads</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.335">getNumThreads</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.336">getNumThreads</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of threads/slots passed to start()</dd>
@@ -1558,7 +1562,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>setRunningProcedureCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.340">setRunningProcedureCount</a>(int&nbsp;count)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.341">setRunningProcedureCount</a>(int&nbsp;count)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#setRunningProcedureCount-int-">ProcedureStore</a></code></span></div>
 <div class="block">Set the number of procedure running.
  This can be used, for example, by the store to know how long to wait before a sync.</div>
@@ -1574,7 +1578,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreTracker</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.345">getStoreTracker</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.346">getStoreTracker</a>()</pre>
 </li>
 </ul>
 <a name="getActiveLogs--">
@@ -1583,7 +1587,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveLogs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.349">getActiveLogs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.350">getActiveLogs</a>()</pre>
 </li>
 </ul>
 <a name="getCorruptedLogs--">
@@ -1592,7 +1596,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getCorruptedLogs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.358">getCorruptedLogs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.359">getCorruptedLogs</a>()</pre>
 </li>
 </ul>
 <a name="recoverLease--">
@@ -1601,7 +1605,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>recoverLease</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.363">recoverLease</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.364">recoverLease</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"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#recoverLease--">ProcedureStore</a></code></span></div>
 <div class="block">Acquire the lease for the procedure store.</div>
@@ -1617,7 +1621,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.412">load</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.413">load</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#load-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureLoader-">ProcedureStore</a></code></span></div>
 <div class="block">Load the Procedures in the store.</div>
@@ -1635,7 +1639,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>tryCleanupLogsOnLoad</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.468">tryCleanupLogsOnLoad</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.469">tryCleanupLogsOnLoad</a>()</pre>
 </li>
 </ul>
 <a name="insert-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">
@@ -1644,7 +1648,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.487">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.488">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
                    <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;subprocs)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">ProcedureStore</a></code></span></div>
 <div class="block">When a procedure is submitted to the executor insert(proc, null) will be called.
@@ -1666,7 +1670,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.521">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;procs)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.522">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;procs)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure:A-">ProcedureStore</a></code></span></div>
 <div class="block">Serialize a set of new procedures.
  These procedures are freshly submitted to the executor and each procedure
@@ -1683,7 +1687,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.550">update</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.551">update</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#update-org.apache.hadoop.hbase.procedure2.Procedure-">ProcedureStore</a></code></span></div>
 <div class="block">The specified procedure was executed,
  and the new state should be written to the store.</div>
@@ -1699,7 +1703,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.573">delete</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.574">delete</a>(long&nbsp;procId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-long-">ProcedureStore</a></code></span></div>
 <div class="block">The specified procId was removed from the executor,
  due to completion, abort or failure.
@@ -1716,7 +1720,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.596">delete</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.597">delete</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&nbsp;proc,
                    long[]&nbsp;subProcIds)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-org.apache.hadoop.hbase.procedure2.Procedure-long:A-">ProcedureStore</a></code></span></div>
 <div class="block">The parent procedure completed.
@@ -1734,7 +1738,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.621">delete</a>(long[]&nbsp;procIds,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.622">delete</a>(long[]&nbsp;procIds,
                    int&nbsp;offset,
                    int&nbsp;count)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-long:A-int-int-">ProcedureStore</a></code></span></div>
@@ -1755,7 +1759,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.632">delete</a>(long[]&nbsp;procIds)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.633">delete</a>(long[]&nbsp;procIds)</pre>
 </li>
 </ul>
 <a name="acquireSlot--">
@@ -1764,7 +1768,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>acquireSlot</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.656">acquireSlot</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.657">acquireSlot</a>()</pre>
 </li>
 </ul>
 <a name="releaseSlot-org.apache.hadoop.hbase.procedure2.util.ByteSlot-">
@@ -1773,7 +1777,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseSlot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.661">releaseSlot</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.662">releaseSlot</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot)</pre>
 </li>
 </ul>
 <a name="pushData-org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.PushType-org.apache.hadoop.hbase.procedure2.util.ByteSlot-long-long:A-">
@@ -1782,7 +1786,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>pushData</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.668">pushData</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.669">pushData</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
                       <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot,
                       long&nbsp;procId,
                       long[]&nbsp;subProcIds)</pre>
@@ -1794,7 +1798,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStoreTracker</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.728">updateStoreTracker</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.729">updateStoreTracker</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
                                 long&nbsp;procId,
                                 long[]&nbsp;subProcIds)</pre>
 </li>
@@ -1805,7 +1809,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>isSyncAborted</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.759">isSyncAborted</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.760">isSyncAborted</a>()</pre>
 </li>
 </ul>
 <a name="syncLoop--">
@@ -1814,7 +1818,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncLoop</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.763">syncLoop</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.764">syncLoop</a>()
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1828,7 +1832,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getSyncMetrics</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.SyncMetrics</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.843">getSyncMetrics</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.SyncMetrics</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.844">getSyncMetrics</a>()</pre>
 </li>
 </ul>
 <a name="syncSlots--">
@@ -1837,7 +1841,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncSlots</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.852">syncSlots</a>()
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.853">syncSlots</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1851,7 +1855,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncSlots</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.880">syncSlots</a>(org.apache.hadoop.fs.FSDataOutputStream&nbsp;stream,
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.881">syncSlots</a>(org.apache.hadoop.fs.FSDataOutputStream&nbsp;stream,
                          <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>[]&nbsp;slots,
                          int&nbsp;offset,
                          int&nbsp;count)
@@ -1868,7 +1872,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncStream</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.899">syncStream</a>(org.apache.hadoop.fs.FSDataOutputStream&nbsp;stream)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.900">syncStream</a>(org.apache.hadoop.fs.FSDataOutputStream&nbsp;stream)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1882,7 +1886,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>rollWriterWithRetries</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.907">rollWriterWithRetries</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.908">rollWriterWithRetries</a>()</pre>
 </li>
 </ul>
 <a name="tryRollWriter--">
@@ -1891,7 +1895,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>tryRollWriter</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.923">tryRollWriter</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.924">tryRollWriter</a>()</pre>
 </li>
 </ul>
 <a name="getMillisToNextPeriodicRoll--">
@@ -1900,7 +1904,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getMillisToNextPeriodicRoll</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.932">getMillisToNextPeriodicRoll</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.933">getMillisToNextPeriodicRoll</a>()</pre>
 </li>
 </ul>
 <a name="getMillisFromLastRoll--">
@@ -1909,7 +1913,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getMillisFromLastRoll</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.939">getMillisFromLastRoll</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.940">getMillisFromLastRoll</a>()</pre>
 </li>
 </ul>
 <a name="periodicRollForTesting--">
@@ -1918,7 +1922,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>periodicRollForTesting</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.944">periodicRollForTesting</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.945">periodicRollForTesting</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1932,7 +1936,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>rollWriterForTesting</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.954">rollWriterForTesting</a>()
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.955">rollWriterForTesting</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1946,7 +1950,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>removeInactiveLogsForTesting</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.964">removeInactiveLogsForTesting</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.965">removeInactiveLogsForTesting</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1960,7 +1964,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>periodicRoll</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.973">periodicRoll</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.974">periodicRoll</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1974,7 +1978,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>rollWriter</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.998">rollWriter</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.999">rollWriter</a>()
                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1988,7 +1992,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>rollWriter</h4>
-<pre>boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1020">rollWriter</a>(long&nbsp;logId)
+<pre>boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1021">rollWriter</a>(long&nbsp;logId)
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2002,7 +2006,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>closeCurrentLogStream</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1087">closeCurrentLogStream</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1088">closeCurrentLogStream</a>()</pre>
 </li>
 </ul>
 <a name="removeInactiveLogs--">
@@ -2011,7 +2015,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>removeInactiveLogs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1112">removeInactiveLogs</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1113">removeInactiveLogs</a>()
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2025,7 +2029,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>buildHoldingCleanupTracker</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1124">buildHoldingCleanupTracker</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1125">buildHoldingCleanupTracker</a>()</pre>
 </li>
 </ul>
 <a name="removeAllLogs-long-">
@@ -2034,7 +2038,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>removeAllLogs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1145">removeAllLogs</a>(long&nbsp;lastLogId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1146">removeAllLogs</a>(long&nbsp;lastLogId)</pre>
 <div class="block">Remove all logs with logId <= <code>lastLogId</code>.</div>
 </li>
 </ul>
@@ -2044,7 +2048,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>removeLogFile</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1167">removeLogFile</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&nbsp;log,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1168">removeLogFile</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&nbsp;log,
                               org.apache.hadoop.fs.Path&nbsp;walArchiveDir)</pre>
 </li>
 </ul>
@@ -2054,7 +2058,16 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1188">getWALDir</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1189">getWALDir</a>()</pre>
+</li>
+</ul>
+<a name="getWalArchiveDir--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getWalArchiveDir</h4>
+<pre>org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1194">getWalArchiveDir</a>()</pre>
 </li>
 </ul>
 <a name="getFileSystem--">
@@ -2063,7 +2076,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileSystem</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1192">getFileSystem</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1198">getFileSystem</a>()</pre>
 </li>
 </ul>
 <a name="getLogFilePath-long-">
@@ -2072,7 +2085,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogFilePath</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1196">getLogFilePath</a>(long&nbsp;logId)
+<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1202">getLogFilePath</a>(long&nbsp;logId)
                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2086,7 +2099,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogIdFromName</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1200">getLogIdFromName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1206">getLogIdFromName</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="getLogFiles--">
@@ -2095,7 +2108,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogFiles</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.FileStatus[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1224">getLogFiles</a>()
+<pre>private&nbsp;org.apache.hadoop.fs.FileStatus[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1230">getLogFiles</a>()
                                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2109,7 +2122,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxLogId</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1235">getMaxLogId</a>(org.apache.hadoop.fs.FileStatus[]&nbsp;logFiles)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1241">getMaxLogId</a>(org.apache.hadoop.fs.FileStatus[]&nbsp;logFiles)</pre>
 </li>
 </ul>
 <a name="initOldLogs-org.apache.hadoop.fs.FileStatus:A-">
@@ -2118,7 +2131,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>initOldLogs</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1248">initOldLogs</a>(org.apache.hadoop.fs.FileStatus[]&nbsp;logFiles)
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1254">initOldLogs</a>(org.apache.hadoop.fs.FileStatus[]&nbsp;logFiles)
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2134,7 +2147,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>initTrackerFromOldLogs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1277">initTrackerFromOldLogs</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1283">initTrackerFromOldLogs</a>()</pre>
 <div class="block">If last log's tracker is not null, use it as <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#storeTracker"><code>storeTracker</code></a>.
  Otherwise, set storeTracker as partial, and let <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><code>ProcedureWALFormatReader</code></a> rebuild
  it using entries in the log.</div>
@@ -2146,7 +2159,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>initOldLog</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1291">initOldLog</a>(org.apache.hadoop.fs.FileStatus&nbsp;logFile,
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1297">initOldLog</a>(org.apache.hadoop.fs.FileStatus&nbsp;logFile,
                                     org.apache.hadoop.fs.Path&nbsp;walArchiveDir)
                              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">Loads given log file and it's tracker.</div>
@@ -2162,7 +2175,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1331">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>public static&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1337">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)
                  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">Parses a directory of WALs building up ProcedureState.
  For testing parse and profiling.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index b1f7eb1..b51b449 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -229,13 +229,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 869db37..ccf30d7 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -710,18 +710,18 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 7eedc5c..19354d1 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,9 +247,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index f8e4b11..3c7146a 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -160,8 +160,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
 </ul>
 </li>
 </ul>


[41/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/rest/TableResource.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/TableResource.html b/devapidocs/org/apache/hadoop/hbase/rest/TableResource.html
index 6cc0dd7..5bc0f61 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/TableResource.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/TableResource.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.43">TableResource</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.44">TableResource</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/rest/ResourceBase.html" title="class in org.apache.hadoop.hbase.rest">ResourceBase</a></pre>
 </li>
 </ul>
@@ -288,7 +288,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/rest/ResourceBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>table</h4>
-<pre><a href="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/rest/TableResource.html#line.45">table</a></pre>
+<pre><a href="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/rest/TableResource.html#line.46">table</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -297,7 +297,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/rest/ResourceBase.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.46">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.47">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -314,7 +314,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/rest/ResourceBase.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TableResource</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.53">TableResource</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table)
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.54">TableResource</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table)
               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">Constructor</div>
 <dl>
@@ -339,7 +339,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/rest/ResourceBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getName</h4>
-<pre><a href="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/rest/TableResource.html#line.59">getName</a>()</pre>
+<pre><a href="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/rest/TableResource.html#line.60">getName</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the table name</dd>
@@ -352,7 +352,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/rest/ResourceBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>exists</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.67">exists</a>()
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.68">exists</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -369,7 +369,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/rest/ResourceBase.html"
 <li class="blockList">
 <h4>getExistsResource</h4>
 <pre>@Path(value="exists")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/ExistsResource.html" title="class in org.apache.hadoop.hbase.rest">ExistsResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.72">getExistsResource</a>()
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/ExistsResource.html" title="class in org.apache.hadoop.hbase.rest">ExistsResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.73">getExistsResource</a>()
                                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -384,7 +384,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/ExistsResource.
 <li class="blockList">
 <h4>getRegionsResource</h4>
 <pre>@Path(value="regions")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RegionsResource.html" title="class in org.apache.hadoop.hbase.rest">RegionsResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.77">getRegionsResource</a>()
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RegionsResource.html" title="class in org.apache.hadoop.hbase.rest">RegionsResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.78">getRegionsResource</a>()
                                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -399,7 +399,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RegionsResource
 <li class="blockList">
 <h4>getScannerResource</h4>
 <pre>@Path(value="scanner")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/ScannerResource.html" title="class in org.apache.hadoop.hbase.rest">ScannerResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.82">getScannerResource</a>()
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/ScannerResource.html" title="class in org.apache.hadoop.hbase.rest">ScannerResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.83">getScannerResource</a>()
                                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -414,7 +414,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/ScannerResource
 <li class="blockList">
 <h4>getSchemaResource</h4>
 <pre>@Path(value="schema")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/SchemaResource.html" title="class in org.apache.hadoop.hbase.rest">SchemaResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.87">getSchemaResource</a>()
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/SchemaResource.html" title="class in org.apache.hadoop.hbase.rest">SchemaResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.88">getSchemaResource</a>()
                                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -429,7 +429,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/SchemaResource.
 <li class="blockList">
 <h4>getMultipleRowResource</h4>
 <pre>@Path(value="{multiget: multiget.*}")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/MultiRowResource.html" title="class in org.apache.hadoop.hbase.rest">MultiRowResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.92">getMultipleRowResource</a>(@QueryParam(value="v")
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/MultiRowResource.html" title="class in org.apache.hadoop.hbase.rest">MultiRowResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.93">getMultipleRowResource</a>(@QueryParam(value="v")
                                                                                      <a href="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;versions,
                                                                                      @PathParam(value="multiget")
                                                                                      <a href="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;path)
@@ -447,7 +447,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/MultiRowResourc
 <li class="blockList">
 <h4>getRowResource</h4>
 <pre>@Path(value="{rowspec: [^*]+}")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RowResource.html" title="class in org.apache.hadoop.hbase.rest">RowResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.98">getRowResource</a>(@PathParam(value="rowspec") @Encoded
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RowResource.html" title="class in org.apache.hadoop.hbase.rest">RowResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.99">getRowResource</a>(@PathParam(value="rowspec") @Encoded
                                                                   <a href="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;rowspec,
                                                                   @QueryParam(value="v")
                                                                   <a href="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;versions,
@@ -469,7 +469,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RowResource.htm
 <li class="blockList">
 <h4>getRowResourceWithSuffixGlobbing</h4>
 <pre>@Path(value="{suffixglobbingspec: .*\\*/.+}")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RowResource.html" title="class in org.apache.hadoop.hbase.rest">RowResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.109">getRowResourceWithSuffixGlobbing</a>(@PathParam(value="suffixglobbingspec") @Encoded
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RowResource.html" title="class in org.apache.hadoop.hbase.rest">RowResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.110">getRowResourceWithSuffixGlobbing</a>(@PathParam(value="suffixglobbingspec") @Encoded
                                                                                                   <a href="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;suffixglobbingspec,
                                                                                                   @QueryParam(value="v")
                                                                                                   <a href="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;versions,
@@ -491,7 +491,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/RowResource.htm
 <li class="blockList">
 <h4>getScanResource</h4>
 <pre>@Path(value="{scanspec: .*[*]$}")
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/TableScanResource.html" title="class in org.apache.hadoop.hbase.rest">TableScanResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.120">getScanResource</a>(@PathParam(value="scanspec")
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/TableScanResource.html" title="class in org.apache.hadoop.hbase.rest">TableScanResource</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/rest/TableResource.html#line.121">getScanResource</a>(@PathParam(value="scanspec")
                                                                            <a href="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;scanSpec,
                                                                            @DefaultValue(value="2147483647") @QueryParam(value="limit")
                                                                            int&nbsp;userRequestedLimit,
@@ -499,7 +499,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/rest/TableScanResour
                                                                            <a href="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;startRow,
                                                                            @DefaultValue(value="") @QueryParam(value="endrow")
                                                                            <a href="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;endRow,
-                                                                           @DefaultValue(value="") @QueryParam(value="column")
+                                                                           @QueryParam(value="column")
                                                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;column,
                                                                            @DefaultValue(value="1") @QueryParam(value="maxversions")
                                                                            int&nbsp;maxVersions,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 034077c..c20ff47 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 69f2dc6..c128782 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -142,9 +142,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 6ef281d..7ba3a64 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -191,9 +191,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index e9070ee..bc2fae6 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -1060,7 +1060,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.1112">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1114">printUsage</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#printUsage--">printUsage</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html" title="class in org.apache.hadoop.hbase.util">AbstractHBaseTool</a></code></dd>
@@ -1073,7 +1073,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.1125">addOptions</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html#line.1127">addOptions</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptions--">AbstractHBaseTool</a></code></span></div>
 <div class="block">Override this to add command-line options using <a href="../../../../../org/apache/hadoop/hbase/util/AbstractHBaseTool.html#addOptWithArg-java.lang.String-java.lang.String-"><code>AbstractHBaseTool.addOptWithArg(java.lang.String, java.lang.String)</code></a>
  and similar methods.</div>
@@ -1089,7 +1089,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.1140">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.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>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
index b31ee51..a3022c8 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -241,6 +241,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_WORKING_DIR">SNAPSHOT_WORKING_DIR</a></span></code>
+<div class="block">The configuration property that determines the filepath of the snapshot
+ base working directory</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOTINFO_FILE">SNAPSHOTINFO_FILE</a></span></code>
 <div class="block">The file contains the snapshot basic information and it is under the directory of a snapshot.</div>
 </td>
@@ -297,26 +304,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </td>
 </tr>
 <tr id="i2" class="altColor">
-<td class="colFirst"><code>private static org.apache.hadoop.fs.Path</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getCompletedSnapshotDir-org.apache.hadoop.fs.Path-java.lang.String-">getCompletedSnapshotDir</a></span>(org.apache.hadoop.fs.Path&nbsp;snapshotsDir,
-                       <a href="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)</code>
-<div class="block">Get the directory to store the snapshot instance</div>
-</td>
-</tr>
-<tr id="i3" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getCompletedSnapshotDir-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">getCompletedSnapshotDir</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                        org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
 <div class="block">Get the directory for a specified snapshot.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getCompletedSnapshotDir-java.lang.String-org.apache.hadoop.fs.Path-">getCompletedSnapshotDir</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,
                        org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
 <div class="block">Get the directory for a completed snapshot.</div>
 </td>
 </tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>private static org.apache.hadoop.fs.Path</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getDefaultWorkingSnapshotDir-org.apache.hadoop.fs.Path-">getDefaultWorkingSnapshotDir</a></span>(org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
+<div class="block">Get the default working directory for snapshots - where they are built, where they are
+ temporarily copied on export, etc.</div>
+</td>
+</tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getMaxMasterTimeout-org.apache.hadoop.conf.Configuration-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription.Type-long-">getMaxMasterTimeout</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -334,45 +341,69 @@ 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/snapshot/SnapshotDescriptionUtils.html#getSnapshotsDir-org.apache.hadoop.fs.Path-">getSnapshotsDir</a></span>(org.apache.hadoop.fs.Path&nbsp;rootDir)</code>&nbsp;</td>
 </tr>
 <tr id="i8" class="altColor">
+<td class="colFirst"><code>private static org.apache.hadoop.fs.Path</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getSpecifiedSnapshotDir-org.apache.hadoop.fs.Path-java.lang.String-">getSpecifiedSnapshotDir</a></span>(org.apache.hadoop.fs.Path&nbsp;snapshotsDir,
+                       <a href="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)</code>
+<div class="block">Get the directory within the given filepath to store the snapshot instance</div>
+</td>
+</tr>
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.fs.Path-">getWorkingSnapshotDir</a></span>(org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">getWorkingSnapshotDir</a></span>(org.apache.hadoop.fs.Path&nbsp;rootDir,
+                     org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">Get the general working directory for snapshots - where they are built, where they are
  temporarily copied on export, etc.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">getWorkingSnapshotDir</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
-                     org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">getWorkingSnapshotDir</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+                     org.apache.hadoop.fs.Path&nbsp;rootDir,
+                     org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.fs.Path</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-java.lang.String-org.apache.hadoop.fs.Path-">getWorkingSnapshotDir</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,
-                     org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#getWorkingSnapshotDir-java.lang.String-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">getWorkingSnapshotDir</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,
+                     org.apache.hadoop.fs.Path&nbsp;rootDir,
+                     org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#isSecurityAvailable-org.apache.hadoop.conf.Configuration-">isSecurityAvailable</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#isSnapshotOwner-org.apache.hadoop.hbase.client.SnapshotDescription-org.apache.hadoop.hbase.security.User-">isSnapshotOwner</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
                <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>
 <div class="block">Check if the user is this table snapshot's owner</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
+<td class="colFirst"><code>static boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#isSubDirectoryOf-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">isSubDirectoryOf</a></span>(org.apache.hadoop.fs.Path&nbsp;workingDir,
+                org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
+<div class="block">Determines if the given workingDir is a subdirectory of the given "root directory"</div>
+</td>
+</tr>
+<tr id="i15" class="rowColor">
+<td class="colFirst"><code>static boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#isWithinDefaultWorkingDir-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">isWithinDefaultWorkingDir</a></span>(org.apache.hadoop.fs.Path&nbsp;workingDir,
+                         org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
+<div class="block">Determines if the given workingDir is a subdirectory of the default working snapshot directory</div>
+</td>
+</tr>
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#readSnapshotInfo-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">readSnapshotInfo</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                 org.apache.hadoop.fs.Path&nbsp;snapshotDir)</code>
 <div class="block">Read in the <code>HBaseProtos.SnapshotDescription</code> stored for the snapshot in the passed directory</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#validate-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.conf.Configuration-">validate</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
         org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
@@ -380,12 +411,12 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  parameters, if none have been supplied.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#writeAclToSnapshotDescription-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.conf.Configuration-">writeAclToSnapshotDescription</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                              org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#writeSnapshotInfo-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">writeSnapshotInfo</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                  org.apache.hadoop.fs.Path&nbsp;workingDir,
@@ -467,13 +498,28 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="SNAPSHOT_WORKING_DIR">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>SNAPSHOT_WORKING_DIR</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/snapshot/SnapshotDescriptionUtils.html#line.121">SNAPSHOT_WORKING_DIR</a></pre>
+<div class="block">The configuration property that determines the filepath of the snapshot
+ base working directory</div>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_WORKING_DIR">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
 <a name="SNAPSHOT_IN_PROGRESS">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_IN_PROGRESS</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/snapshot/SnapshotDescriptionUtils.html#line.118">SNAPSHOT_IN_PROGRESS</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/snapshot/SnapshotDescriptionUtils.html#line.124">SNAPSHOT_IN_PROGRESS</a></pre>
 <div class="block">This tag will be created in in-progess snapshots</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -487,7 +533,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>NO_SNAPSHOT_START_TIME_SPECIFIED</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.121">NO_SNAPSHOT_START_TIME_SPECIFIED</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.127">NO_SNAPSHOT_START_TIME_SPECIFIED</a></pre>
 <div class="block">Default value if no start time is specified</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -501,7 +547,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>MASTER_SNAPSHOT_TIMEOUT_MILLIS</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/snapshot/SnapshotDescriptionUtils.html#line.124">MASTER_SNAPSHOT_TIMEOUT_MILLIS</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/snapshot/SnapshotDescriptionUtils.html#line.130">MASTER_SNAPSHOT_TIMEOUT_MILLIS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.MASTER_SNAPSHOT_TIMEOUT_MILLIS">Constant Field Values</a></dd>
@@ -514,7 +560,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_WAIT_TIME</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.127">DEFAULT_MAX_WAIT_TIME</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.133">DEFAULT_MAX_WAIT_TIME</a></pre>
 <div class="block">By default, wait 300 seconds for a snapshot to complete</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -529,7 +575,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <li class="blockList">
 <h4>SNAPSHOT_TIMEOUT_MILLIS_DEFAULT</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.135">SNAPSHOT_TIMEOUT_MILLIS_DEFAULT</a></pre>
+public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.141">SNAPSHOT_TIMEOUT_MILLIS_DEFAULT</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#DEFAULT_MAX_WAIT_TIME"><code>DEFAULT_MAX_WAIT_TIME</code></a> instead.</span></div>
 <div class="block">By default, check to see if the snapshot is complete (ms)</div>
 <dl>
@@ -545,7 +591,7 @@ public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/
 <li class="blockList">
 <h4>SNAPSHOT_TIMEOUT_MILLIS_KEY</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static 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/snapshot/SnapshotDescriptionUtils.html#line.143">SNAPSHOT_TIMEOUT_MILLIS_KEY</a></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/snapshot/SnapshotDescriptionUtils.html#line.149">SNAPSHOT_TIMEOUT_MILLIS_KEY</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#MASTER_SNAPSHOT_TIMEOUT_MILLIS"><code>MASTER_SNAPSHOT_TIMEOUT_MILLIS</code></a> instead.</span></div>
 <div class="block">Conf key for # of ms elapsed before injecting a snapshot timeout error when waiting for
  completion.</div>
@@ -569,7 +615,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SnapshotDescriptionUtils</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.145">SnapshotDescriptionUtils</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.151">SnapshotDescriptionUtils</a>()</pre>
 </li>
 </ul>
 </li>
@@ -586,7 +632,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxMasterTimeout</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.155">getMaxMasterTimeout</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.161">getMaxMasterTimeout</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                        org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription.Type&nbsp;type,
                                        long&nbsp;defaultMaxWaitTime)</pre>
 <dl>
@@ -605,7 +651,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotRootDir</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.173">getSnapshotRootDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.179">getSnapshotRootDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
 <div class="block">Get the snapshot root directory. All the snapshots are kept under this directory, i.e.
  ${hbase.rootdir}/.snapshot</div>
 <dl>
@@ -622,7 +668,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompletedSnapshotDir</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.184">getCompletedSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.190">getCompletedSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                                                 org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
 <div class="block">Get the directory for a specified snapshot. This directory is a sub-directory of snapshot root
  directory and all the data files for a snapshot are kept under this directory.</div>
@@ -641,7 +687,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompletedSnapshotDir</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.195">getCompletedSnapshotDir</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 static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.201">getCompletedSnapshotDir</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,
                                                                 org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
 <div class="block">Get the directory for a completed snapshot. This directory is a sub-directory of snapshot root
  directory and all the data files for a snapshot are kept under this directory.</div>
@@ -654,74 +700,80 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 </dl>
 </li>
 </ul>
-<a name="getWorkingSnapshotDir-org.apache.hadoop.fs.Path-">
+<a name="getWorkingSnapshotDir-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWorkingSnapshotDir</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.205">getWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.212">getWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
+                                                              org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Get the general working directory for snapshots - where they are built, where they are
  temporarily copied on export, etc.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>rootDir</code> - root directory of the HBase installation</dd>
+<dd><code>conf</code> - Configuration of the HBase instance</dd>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Path to the snapshot tmp directory, relative to the passed root directory</dd>
 </dl>
 </li>
 </ul>
-<a name="getWorkingSnapshotDir-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-">
+<a name="getWorkingSnapshotDir-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWorkingSnapshotDir</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.215">getWorkingSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
-                                                              org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.224">getWorkingSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+                                                              org.apache.hadoop.fs.Path&nbsp;rootDir,
+                                                              org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>snapshot</code> - snapshot that will be built</dd>
 <dd><code>rootDir</code> - root directory of the hbase installation</dd>
+<dd><code>conf</code> - Configuration of the HBase instance</dd>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd><code>Path</code> where one can build a snapshot</dd>
 </dl>
 </li>
 </ul>
-<a name="getWorkingSnapshotDir-java.lang.String-org.apache.hadoop.fs.Path-">
+<a name="getWorkingSnapshotDir-java.lang.String-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWorkingSnapshotDir</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.225">getWorkingSnapshotDir</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,
-                                                              org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.236">getWorkingSnapshotDir</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,
+                                                              org.apache.hadoop.fs.Path&nbsp;rootDir,
+                                                              org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>snapshotName</code> - name of the snapshot</dd>
 <dd><code>rootDir</code> - root directory of the hbase installation</dd>
+<dd><code>conf</code> - Configuration of the HBase instance</dd>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd><code>Path</code> where one can build a snapshot</dd>
 </dl>
 </li>
 </ul>
-<a name="getCompletedSnapshotDir-org.apache.hadoop.fs.Path-java.lang.String-">
+<a name="getSpecifiedSnapshotDir-org.apache.hadoop.fs.Path-java.lang.String-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getCompletedSnapshotDir</h4>
-<pre>private static final&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.235">getCompletedSnapshotDir</a>(org.apache.hadoop.fs.Path&nbsp;snapshotsDir,
+<h4>getSpecifiedSnapshotDir</h4>
+<pre>private static final&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.247">getSpecifiedSnapshotDir</a>(org.apache.hadoop.fs.Path&nbsp;snapshotsDir,
                                                                        <a href="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>
-<div class="block">Get the directory to store the snapshot instance</div>
+<div class="block">Get the directory within the given filepath to store the snapshot instance</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>snapshotsDir</code> - hbase-global directory for storing all snapshots</dd>
+<dd><code>snapshotsDir</code> - directory to store snapshot directory within</dd>
 <dd><code>snapshotName</code> - name of the snapshot to take</dd>
 <dt><span class="returnLabel">Returns:</span></dt>
-<dd>the final directory for the completed snapshot</dd>
+<dd>the final directory for the snapshot in the given filepath</dd>
 </dl>
 </li>
 </ul>
@@ -731,7 +783,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotsDir</h4>
-<pre>public static final&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.243">getSnapshotsDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+<pre>public static final&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.255">getSnapshotsDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>rootDir</code> - hbase root directory</dd>
@@ -740,13 +792,68 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 </dl>
 </li>
 </ul>
+<a name="isSubDirectoryOf-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>isSubDirectoryOf</h4>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.266">isSubDirectoryOf</a>(org.apache.hadoop.fs.Path&nbsp;workingDir,
+                                       org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+<div class="block">Determines if the given workingDir is a subdirectory of the given "root directory"</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>workingDir</code> - a directory to check</dd>
+<dd><code>rootDir</code> - root directory of the HBase installation</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>true if the given workingDir is a subdirectory of the given root directory,
+   false otherwise</dd>
+</dl>
+</li>
+</ul>
+<a name="isWithinDefaultWorkingDir-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>isWithinDefaultWorkingDir</h4>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.277">isWithinDefaultWorkingDir</a>(org.apache.hadoop.fs.Path&nbsp;workingDir,
+                                                org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<div class="block">Determines if the given workingDir is a subdirectory of the default working snapshot directory</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>workingDir</code> - a directory to check</dd>
+<dd><code>conf</code> - configuration for the HBase cluster</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>true if the given workingDir is a subdirectory of the default working directory for
+   snapshots, false otherwise</dd>
+</dl>
+</li>
+</ul>
+<a name="getDefaultWorkingSnapshotDir-org.apache.hadoop.fs.Path-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getDefaultWorkingSnapshotDir</h4>
+<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.288">getDefaultWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir)</pre>
+<div class="block">Get the default working directory for snapshots - where they are built, where they are
+ temporarily copied on export, etc.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>rootDir</code> - root directory of the HBase installation</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>Path to the default snapshot tmp directory, relative to the passed root directory</dd>
+</dl>
+</li>
+</ul>
 <a name="validate-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.conf.Configuration-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>validate</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.257">validate</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.302">validate</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                                                                                             org.apache.hadoop.conf.Configuration&nbsp;conf)
                                                                                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang">IllegalArgumentException</a>,
                                                                                                             <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>
@@ -772,7 +879,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSnapshotInfo</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.290">writeSnapshotInfo</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.335">writeSnapshotInfo</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                      org.apache.hadoop.fs.Path&nbsp;workingDir,
                                      org.apache.hadoop.fs.FileSystem&nbsp;fs)
                               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>
@@ -794,7 +901,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>createInProgressTag</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.315">createInProgressTag</a>(org.apache.hadoop.fs.Path&nbsp;workingDir,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.360">createInProgressTag</a>(org.apache.hadoop.fs.Path&nbsp;workingDir,
                                        org.apache.hadoop.fs.FileSystem&nbsp;fs)
                                 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">Create in-progress tag under .tmp of in-progress snapshot</div>
@@ -810,7 +917,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>readSnapshotInfo</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.330">readSnapshotInfo</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.375">readSnapshotInfo</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                                                                                     org.apache.hadoop.fs.Path&nbsp;snapshotDir)
                                                                                                              throws <a href="../../../../../org/apache/hadoop/hbase/snapshot/CorruptedSnapshotException.html" title="class in org.apache.hadoop.hbase.snapshot">CorruptedSnapshotException</a></pre>
 <div class="block">Read in the <code>HBaseProtos.SnapshotDescription</code> stored for the snapshot in the passed directory</div>
@@ -832,7 +939,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>completeSnapshot</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.358">completeSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.403">completeSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                     org.apache.hadoop.fs.Path&nbsp;rootdir,
                                     org.apache.hadoop.fs.Path&nbsp;workingDir,
                                     org.apache.hadoop.fs.FileSystem&nbsp;fs)
@@ -859,7 +966,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>isSnapshotOwner</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.377">isSnapshotOwner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.422">isSnapshotOwner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotDescription.html" title="class in org.apache.hadoop.hbase.client">SnapshotDescription</a>&nbsp;snapshot,
                                       <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</pre>
 <div class="block">Check if the user is this table snapshot's owner</div>
 <dl>
@@ -878,7 +985,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <h4>isSecurityAvailable</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.383">isSecurityAvailable</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.428">isSecurityAvailable</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -892,7 +999,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writeAclToSnapshotDescription</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.391">writeAclToSnapshotDescription</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
+<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.436">writeAclToSnapshotDescription</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot,
                                                                                                                                   org.apache.hadoop.conf.Configuration&nbsp;conf)
                                                                                                                            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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
index cc0da89..34a4271 100644
--- a/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.143">SnapshotManifest.RegionVisitor</a>&lt;TRegion,TFamily&gt;</pre>
+<pre>static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.html#line.154">SnapshotManifest.RegionVisitor</a>&lt;TRegion,TFamily&gt;</pre>
 </li>
 </ul>
 </div>
@@ -173,7 +173,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOpen</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.144">regionOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
+<pre><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.155">regionOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -189,7 +189,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>regionClose</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.145">regionClose</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.156">regionClose</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -205,7 +205,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>familyOpen</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TFamily</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.147">familyOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region,
+<pre><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TFamily</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.158">familyOpen</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region,
                    byte[]&nbsp;familyName)
             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>
@@ -222,7 +222,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>familyClose</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.148">familyClose</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.159">familyClose</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region,
                  <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TFamily</a>&nbsp;family)
           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>
@@ -239,7 +239,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>storeFile</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.150">storeFile</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html#line.161">storeFile</a>(<a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TRegion</a>&nbsp;region,
                <a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotManifest.RegionVisitor.html" title="type parameter in SnapshotManifest.RegionVisitor">TFamily</a>&nbsp;family,
                <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;storeFile)
         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>


[48/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index e746450..b4ceedc 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,16 +5,16 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180911143207+00'00')
-/CreationDate (D:20180911145024+00'00')
+/ModDate (D:20180912143308+00'00')
+/CreationDate (D:20180912145001+00'00')
 >>
 endobj
 2 0 obj
 << /Type /Catalog
 /Pages 3 0 R
 /Names 28 0 R
-/Outlines 5008 0 R
-/PageLabels 5259 0 R
+/Outlines 5009 0 R
+/PageLabels 5260 0 R
 /PageMode /UseOutlines
 /OpenAction [7 0 R /FitH 842.89]
 /ViewerPreferences << /DisplayDocTitle true
@@ -24,7 +24,7 @@ endobj
 3 0 obj
 << /Type /Pages
 /Count 787
-/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 26 0 R 46 0 R 49 0 R 52 0 R 56 0 R 63 0 R 65 0 R 69 0 R 71 0 R 73 0 R 80 0 R 83 0 R 85 0 R 91 0 R 94 0 R 96 0 R 98 0 R 105 0 R 112 0 R 117 0 R 119 0 R 135 0 R 140 0 R 148 0 R 157 0 R 165 0 R 169 0 R 178 0 R 189 0 R 193 0 R 195 0 R 199 0 R 208 0 R 217 0 R 225 0 R 234 0 R 239 0 R 248 0 R 256 0 R 265 0 R 278 0 R 285 0 R 295 0 R 303 0 R 311 0 R 318 0 R 327 0 R 333 0 R 339 0 R 346 0 R 354 0 R 362 0 R 373 0 R 386 0 R 394 0 R 401 0 R 409 0 R 417 0 R 426 0 R 436 0 R 444 0 R 450 0 R 459 0 R 471 0 R 481 0 R 488 0 R 496 0 R 503 0 R 512 0 R 520 0 R 524 0 R 530 0 R 535 0 R 539 0 R 555 0 R 566 0 R 570 0 R 585 0 R 590 0 R 595 0 R 597 0 R 599 0 R 602 0 R 604 0 R 606 0 R 614 0 R 620 0 R 623 0 R 627 0 R 636 0 R 647 0 R 655 0 R 659 0 R 663 0 R 665 0 R 675 0 R 690 0 R 697 0 R 708 0 R 718 0 R 729 0 R 741 0 R 761 0 R 776 0 R 783 0 R 790 0 R 796 0 R 799 0 R 803 0 R 807 0 R 810 0 R 813 0 R 815 0 R 818 0 R 822 0 R 824 0 R 828 0 R 834 0 R 839 0 R 
 843 0 R 846 0 R 852 0 R 854 0 R 858 0 R 866 0 R 868 0 R 871 0 R 874 0 R 877 0 R 880 0 R 894 0 R 902 0 R 913 0 R 924 0 R 930 0 R 940 0 R 951 0 R 954 0 R 958 0 R 961 0 R 966 0 R 975 0 R 983 0 R 988 0 R 992 0 R 997 0 R 1001 0 R 1003 0 R 1018 0 R 1029 0 R 1034 0 R 1041 0 R 1044 0 R 1052 0 R 1060 0 R 1065 0 R 1070 0 R 1075 0 R 1077 0 R 1079 0 R 1081 0 R 1091 0 R 1099 0 R 1103 0 R 1110 0 R 1117 0 R 1125 0 R 1129 0 R 1135 0 R 1140 0 R 1148 0 R 1152 0 R 1157 0 R 1159 0 R 1165 0 R 1173 0 R 1179 0 R 1186 0 R 1197 0 R 1201 0 R 1203 0 R 1205 0 R 1209 0 R 1212 0 R 1217 0 R 1220 0 R 1232 0 R 1236 0 R 1242 0 R 1250 0 R 1255 0 R 1259 0 R 1263 0 R 1265 0 R 1268 0 R 1271 0 R 1274 0 R 1278 0 R 1282 0 R 1286 0 R 1291 0 R 1295 0 R 1298 0 R 1300 0 R 1310 0 R 1312 0 R 1317 0 R 1330 0 R 1334 0 R 1340 0 R 1342 0 R 1353 0 R 1356 0 R 1362 0 R 1370 0 R 1373 0 R 1380 0 R 1387 0 R 1390 0 R 1392 0 R 1401 0 R 1403 0 R 1405 0 R 1408 0 R 1410 0 R 1412 0 R 1414 0 R 1416 0 R 1419 0 R 1423 0 R 1428 0 R 1430 0 R 1432 0 
 R 1434 0 R 1439 0 R 1446 0 R 1452 0 R 1455 0 R 1457 0 R 1460 0 R 1464 0 R 1468 0 R 1471 0 R 1473 0 R 1475 0 R 1478 0 R 1483 0 R 1489 0 R 1497 0 R 1511 0 R 1525 0 R 1528 0 R 1533 0 R 1546 0 R 1551 0 R 1566 0 R 1574 0 R 1578 0 R 1587 0 R 1602 0 R 1614 0 R 1617 0 R 1631 0 R 1639 0 R 1644 0 R 1655 0 R 1660 0 R 1666 0 R 1672 0 R 1684 0 R 1687 0 R 1696 0 R 1699 0 R 1708 0 R 1713 0 R 1718 0 R 1722 0 R 1735 0 R 1737 0 R 1743 0 R 1749 0 R 1752 0 R 1760 0 R 1768 0 R 1772 0 R 1774 0 R 1776 0 R 1788 0 R 1794 0 R 1803 0 R 1810 0 R 1823 0 R 1829 0 R 1835 0 R 1846 0 R 1852 0 R 1857 0 R 1861 0 R 1865 0 R 1868 0 R 1873 0 R 1878 0 R 1884 0 R 1889 0 R 1893 0 R 1902 0 R 1908 0 R 1911 0 R 1915 0 R 1924 0 R 1931 0 R 1937 0 R 1944 0 R 1948 0 R 1951 0 R 1956 0 R 1961 0 R 1967 0 R 1969 0 R 1971 0 R 1974 0 R 1985 0 R 1988 0 R 1995 0 R 2003 0 R 2008 0 R 2011 0 R 2016 0 R 2018 0 R 2021 0 R 2026 0 R 2029 0 R 2031 0 R 2034 0 R 2037 0 R 2040 0 R 2050 0 R 2055 0 R 2060 0 R 2062 0 R 2070 0 R 2077 0 R 2084 0 R 2090 
 0 R 2095 0 R 2097 0 R 2106 0 R 2116 0 R 2126 0 R 2132 0 R 2139 0 R 2141 0 R 2146 0 R 2148 0 R 2150 0 R 2154 0 R 2157 0 R 2160 0 R 2165 0 R 2169 0 R 2180 0 R 2183 0 R 2186 0 R 2190 0 R 2194 0 R 2197 0 R 2199 0 R 2204 0 R 2207 0 R 2209 0 R 2214 0 R 2224 0 R 2226 0 R 2228 0 R 2230 0 R 2232 0 R 2235 0 R 2237 0 R 2239 0 R 2242 0 R 2244 0 R 2246 0 R 2250 0 R 2255 0 R 2264 0 R 2266 0 R 2268 0 R 2274 0 R 2276 0 R 2281 0 R 2283 0 R 2285 0 R 2292 0 R 2297 0 R 2301 0 R 2306 0 R 2310 0 R 2312 0 R 2314 0 R 2318 0 R 2321 0 R 2323 0 R 2325 0 R 2329 0 R 2331 0 R 2334 0 R 2336 0 R 2338 0 R 2340 0 R 2347 0 R 2350 0 R 2355 0 R 2357 0 R 2359 0 R 2361 0 R 2363 0 R 2371 0 R 2382 0 R 2396 0 R 2407 0 R 2411 0 R 2416 0 R 2420 0 R 2423 0 R 2428 0 R 2434 0 R 2436 0 R 2439 0 R 2441 0 R 2443 0 R 2445 0 R 2450 0 R 2452 0 R 2465 0 R 2468 0 R 2476 0 R 2482 0 R 2494 0 R 2508 0 R 2521 0 R 2540 0 R 2542 0 R 2544 0 R 2548 0 R 2566 0 R 2572 0 R 2584 0 R 2588 0 R 2592 0 R 2601 0 R 2613 0 R 2618 0 R 2628 0 R 2641 0 R 266
 0 0 R 2669 0 R 2672 0 R 2681 0 R 2698 0 R 2705 0 R 2708 0 R 2713 0 R 2717 0 R 2720 0 R 2729 0 R 2738 0 R 2741 0 R 2743 0 R 2747 0 R 2761 0 R 2770 0 R 2775 0 R 2779 0 R 2782 0 R 2784 0 R 2786 0 R 2788 0 R 2793 0 R 2806 0 R 2816 0 R 2824 0 R 2831 0 R 2836 0 R 2846 0 R 2853 0 R 2859 0 R 2861 0 R 2870 0 R 2878 0 R 2880 0 R 2884 0 R 2886 0 R 2897 0 R 2903 0 R 2905 0 R 2914 0 R 2917 0 R 2927 0 R 2931 0 R 2940 0 R 2948 0 R 2953 0 R 2957 0 R 2961 0 R 2963 0 R 2969 0 R 2973 0 R 2977 0 R 2983 0 R 2989 0 R 2992 0 R 2998 0 R 3002 0 R 3011 0 R 3016 0 R 3022 0 R 3032 0 R 3039 0 R 3046 0 R 3049 0 R 3052 0 R 3059 0 R 3064 0 R 3067 0 R 3072 0 R 3082 0 R 3087 0 R 3089 0 R 3093 0 R 3098 0 R 3103 0 R 3110 0 R 3117 0 R 3124 0 R 3132 0 R 3138 0 R 3143 0 R 3147 0 R 3150 0 R 3153 0 R 3162 0 R 3167 0 R 3171 0 R 3179 0 R 3184 0 R 3188 0 R 3190 0 R 3201 0 R 3206 0 R 3209 0 R 3211 0 R 3213 0 R 3223 0 R 3230 0 R 3234 0 R 3237 0 R 3244 0 R 3248 0 R 3251 0 R 3255 0 R 3260 0 R 3268 0 R 3273 0 R 3278 0 R 3283 0 R 3
 285 0 R 3288 0 R 3290 0 R 3294 0 R 3305 0 R 3307 0 R 3311 0 R 3314 0 R 3318 0 R 3321 0 R 3325 0 R 3327 0 R 3340 0 R 3345 0 R 3350 0 R 3356 0 R 3364 0 R 3366 0 R 3374 0 R 3392 0 R 3404 0 R 3410 0 R 3426 0 R 3430 0 R 3435 0 R 3437 0 R 3444 0 R 3447 0 R 3452 0 R 3455 0 R 3457 0 R 3459 0 R 3461 0 R 3465 0 R 3483 0 R 3486 0 R 3491 0 R 3497 0 R 3507 0 R 3512 0 R 3522 0 R 3533 0 R 3540 0 R 3545 0 R 3552 0 R 3557 0 R 3560 0 R 3568 0 R 3572 0 R 3577 0 R 3582 0 R 3595 0 R 3598 0 R 3604 0 R 3610 0 R 3615 0 R 3625 0 R 3634 0 R 3640 0 R 3649 0 R 3658 0 R 3663 0 R 3669 0 R 3675 0 R 3680 0 R 3682 0 R 3688 0 R 3695 0 R 3697 0 R 3705 0 R 3707 0 R 3713 0 R 3721 0 R 3727 0 R 3736 0 R 3742 0 R 3753 0 R 3762 0 R 3774 0 R 3784 0 R 3795 0 R 3799 0 R 3801 0 R 3805 0 R 3818 0 R 3824 0 R 3829 0 R 3835 0 R 3839 0 R 3842 0 R 3847 0 R 3849 0 R 3853 0 R 3855 0 R 3859 0 R 3862 0 R 3865 0 R 3873 0 R 3875 0 R 3881 0 R 3884 0 R 3890 0 R 3894 0 R 3897 0 R 3900 0 R 3903 0 R 3907 0 R 3910 0 R 3915 0 R 3920 0 R 3923 0 R
  3931 0 R 3935 0 R 3939 0 R 3941 0 R 3944 0 R 3947 0 R 3952 0 R 3959 0 R 3965 0 R 3969 0 R 3972 0 R 3979 0 R 3987 0 R 3991 0 R 3994 0 R 3996 0 R 4000 0 R 4005 0 R 4010 0 R 4013 0 R 4022 0 R 4027 0 R 4031 0 R 4034 0 R 4042 0 R 4047 0 R 4055 0 R 4060 0 R 4062 0 R 4068 0 R 4070 0 R 4075 0 R 4079 0 R 4084 0 R 4088 0 R 4100 0 R 4116 0 R 4131 0 R 4136 0 R 4139 0 R 4142 0 R 4148 0 R 4153 0 R 4155 0 R 4157 0 R 4159 0 R 4161 0 R 4163 0 R 4172 0 R 4176 0 R 4180 0 R 4184 0 R 4186 0 R 4193 0 R 4203 0 R 4210 0 R 4213 0 R 4216 0 R 4218 0 R 4225 0 R 4232 0 R 4243 0 R 4247 0 R 4250 0 R 4254 0 R 4257 0 R 4263 0 R 4266 0 R 4281 0 R 4286 0 R 4309 0 R 4313 0 R 4320 0 R 4331 0 R 4340 0 R 4343 0 R 4346 0 R 4349 0 R 4365 0 R 4370 0 R 4377 0 R 4380 0 R 4383 0 R 4390 0 R 4395 0 R 4399 0 R 4401 0 R 4407 0 R 4414 0 R 4422 0 R 4426 0 R 4431 0 R 4436 0 R 4442 0 R 4449 0 R 4456 0 R 4462 0 R 4470 0 R 4478 0 R 4482 0 R 4491 0 R 4499 0 R 4505 0 R]
+/Kids [7 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 26 0 R 46 0 R 49 0 R 52 0 R 56 0 R 63 0 R 65 0 R 69 0 R 71 0 R 73 0 R 80 0 R 83 0 R 85 0 R 91 0 R 94 0 R 96 0 R 98 0 R 105 0 R 112 0 R 117 0 R 119 0 R 135 0 R 140 0 R 148 0 R 157 0 R 165 0 R 169 0 R 178 0 R 189 0 R 193 0 R 195 0 R 199 0 R 208 0 R 217 0 R 225 0 R 234 0 R 239 0 R 248 0 R 256 0 R 265 0 R 278 0 R 285 0 R 295 0 R 303 0 R 311 0 R 318 0 R 327 0 R 333 0 R 339 0 R 346 0 R 354 0 R 362 0 R 373 0 R 386 0 R 394 0 R 401 0 R 409 0 R 417 0 R 426 0 R 436 0 R 444 0 R 451 0 R 458 0 R 467 0 R 480 0 R 488 0 R 495 0 R 503 0 R 511 0 R 520 0 R 525 0 R 531 0 R 536 0 R 540 0 R 556 0 R 567 0 R 571 0 R 586 0 R 591 0 R 596 0 R 598 0 R 600 0 R 603 0 R 605 0 R 607 0 R 615 0 R 621 0 R 624 0 R 628 0 R 637 0 R 648 0 R 656 0 R 660 0 R 664 0 R 666 0 R 676 0 R 691 0 R 698 0 R 709 0 R 719 0 R 730 0 R 742 0 R 762 0 R 777 0 R 784 0 R 791 0 R 797 0 R 800 0 R 804 0 R 808 0 R 811 0 R 814 0 R 816 0 R 819 0 R 823 0 R 825 0 R 829 0 R 835 0 R 840 0 R 
 844 0 R 847 0 R 853 0 R 855 0 R 859 0 R 867 0 R 869 0 R 872 0 R 875 0 R 878 0 R 881 0 R 895 0 R 903 0 R 914 0 R 925 0 R 931 0 R 941 0 R 952 0 R 955 0 R 959 0 R 962 0 R 967 0 R 976 0 R 984 0 R 989 0 R 993 0 R 998 0 R 1002 0 R 1004 0 R 1019 0 R 1030 0 R 1035 0 R 1042 0 R 1045 0 R 1053 0 R 1061 0 R 1066 0 R 1071 0 R 1076 0 R 1078 0 R 1080 0 R 1082 0 R 1092 0 R 1100 0 R 1104 0 R 1111 0 R 1118 0 R 1126 0 R 1130 0 R 1136 0 R 1141 0 R 1149 0 R 1153 0 R 1158 0 R 1160 0 R 1166 0 R 1174 0 R 1180 0 R 1187 0 R 1198 0 R 1202 0 R 1204 0 R 1206 0 R 1210 0 R 1213 0 R 1218 0 R 1221 0 R 1233 0 R 1237 0 R 1243 0 R 1251 0 R 1256 0 R 1260 0 R 1264 0 R 1266 0 R 1269 0 R 1272 0 R 1275 0 R 1279 0 R 1283 0 R 1287 0 R 1292 0 R 1296 0 R 1299 0 R 1301 0 R 1311 0 R 1313 0 R 1318 0 R 1331 0 R 1335 0 R 1341 0 R 1343 0 R 1354 0 R 1357 0 R 1363 0 R 1371 0 R 1374 0 R 1381 0 R 1388 0 R 1391 0 R 1393 0 R 1402 0 R 1404 0 R 1406 0 R 1409 0 R 1411 0 R 1413 0 R 1415 0 R 1417 0 R 1420 0 R 1424 0 R 1429 0 R 1431 0 R 1433 0 
 R 1435 0 R 1440 0 R 1447 0 R 1453 0 R 1456 0 R 1458 0 R 1461 0 R 1465 0 R 1469 0 R 1472 0 R 1474 0 R 1476 0 R 1479 0 R 1484 0 R 1490 0 R 1498 0 R 1512 0 R 1526 0 R 1529 0 R 1534 0 R 1547 0 R 1552 0 R 1567 0 R 1575 0 R 1579 0 R 1588 0 R 1603 0 R 1615 0 R 1618 0 R 1632 0 R 1640 0 R 1645 0 R 1656 0 R 1661 0 R 1667 0 R 1673 0 R 1685 0 R 1688 0 R 1697 0 R 1700 0 R 1709 0 R 1714 0 R 1719 0 R 1723 0 R 1736 0 R 1738 0 R 1744 0 R 1750 0 R 1753 0 R 1761 0 R 1769 0 R 1773 0 R 1775 0 R 1777 0 R 1789 0 R 1795 0 R 1804 0 R 1811 0 R 1824 0 R 1830 0 R 1836 0 R 1847 0 R 1853 0 R 1858 0 R 1862 0 R 1866 0 R 1869 0 R 1874 0 R 1879 0 R 1885 0 R 1890 0 R 1894 0 R 1903 0 R 1909 0 R 1912 0 R 1916 0 R 1925 0 R 1932 0 R 1938 0 R 1945 0 R 1949 0 R 1952 0 R 1957 0 R 1962 0 R 1968 0 R 1970 0 R 1972 0 R 1975 0 R 1986 0 R 1989 0 R 1996 0 R 2004 0 R 2009 0 R 2012 0 R 2017 0 R 2019 0 R 2022 0 R 2027 0 R 2030 0 R 2032 0 R 2035 0 R 2038 0 R 2041 0 R 2051 0 R 2056 0 R 2061 0 R 2063 0 R 2071 0 R 2078 0 R 2085 0 R 2091 
 0 R 2096 0 R 2098 0 R 2107 0 R 2117 0 R 2127 0 R 2133 0 R 2140 0 R 2142 0 R 2147 0 R 2149 0 R 2151 0 R 2155 0 R 2158 0 R 2161 0 R 2166 0 R 2170 0 R 2181 0 R 2184 0 R 2187 0 R 2191 0 R 2195 0 R 2198 0 R 2200 0 R 2205 0 R 2208 0 R 2210 0 R 2215 0 R 2225 0 R 2227 0 R 2229 0 R 2231 0 R 2233 0 R 2236 0 R 2238 0 R 2240 0 R 2243 0 R 2245 0 R 2247 0 R 2251 0 R 2256 0 R 2265 0 R 2267 0 R 2269 0 R 2275 0 R 2277 0 R 2282 0 R 2284 0 R 2286 0 R 2293 0 R 2298 0 R 2302 0 R 2307 0 R 2311 0 R 2313 0 R 2315 0 R 2319 0 R 2322 0 R 2324 0 R 2326 0 R 2330 0 R 2332 0 R 2335 0 R 2337 0 R 2339 0 R 2341 0 R 2348 0 R 2351 0 R 2356 0 R 2358 0 R 2360 0 R 2362 0 R 2364 0 R 2372 0 R 2383 0 R 2397 0 R 2408 0 R 2412 0 R 2417 0 R 2421 0 R 2424 0 R 2429 0 R 2435 0 R 2437 0 R 2440 0 R 2442 0 R 2444 0 R 2446 0 R 2451 0 R 2453 0 R 2466 0 R 2469 0 R 2477 0 R 2483 0 R 2495 0 R 2509 0 R 2522 0 R 2541 0 R 2543 0 R 2545 0 R 2549 0 R 2567 0 R 2573 0 R 2585 0 R 2589 0 R 2593 0 R 2602 0 R 2614 0 R 2619 0 R 2629 0 R 2642 0 R 266
 1 0 R 2670 0 R 2673 0 R 2682 0 R 2699 0 R 2706 0 R 2709 0 R 2714 0 R 2718 0 R 2721 0 R 2730 0 R 2739 0 R 2742 0 R 2744 0 R 2748 0 R 2762 0 R 2771 0 R 2776 0 R 2780 0 R 2783 0 R 2785 0 R 2787 0 R 2789 0 R 2794 0 R 2807 0 R 2817 0 R 2825 0 R 2832 0 R 2837 0 R 2847 0 R 2854 0 R 2860 0 R 2862 0 R 2871 0 R 2879 0 R 2881 0 R 2885 0 R 2887 0 R 2898 0 R 2904 0 R 2906 0 R 2915 0 R 2918 0 R 2928 0 R 2932 0 R 2941 0 R 2949 0 R 2954 0 R 2958 0 R 2962 0 R 2964 0 R 2970 0 R 2974 0 R 2978 0 R 2984 0 R 2990 0 R 2993 0 R 2999 0 R 3003 0 R 3012 0 R 3017 0 R 3023 0 R 3033 0 R 3040 0 R 3047 0 R 3050 0 R 3053 0 R 3060 0 R 3065 0 R 3068 0 R 3073 0 R 3083 0 R 3088 0 R 3090 0 R 3094 0 R 3099 0 R 3104 0 R 3111 0 R 3118 0 R 3125 0 R 3133 0 R 3139 0 R 3144 0 R 3148 0 R 3151 0 R 3154 0 R 3163 0 R 3168 0 R 3172 0 R 3180 0 R 3185 0 R 3189 0 R 3191 0 R 3202 0 R 3207 0 R 3210 0 R 3212 0 R 3214 0 R 3224 0 R 3231 0 R 3235 0 R 3238 0 R 3245 0 R 3249 0 R 3252 0 R 3256 0 R 3261 0 R 3269 0 R 3274 0 R 3279 0 R 3284 0 R 3
 286 0 R 3289 0 R 3291 0 R 3295 0 R 3306 0 R 3308 0 R 3312 0 R 3315 0 R 3319 0 R 3322 0 R 3326 0 R 3328 0 R 3341 0 R 3346 0 R 3351 0 R 3357 0 R 3365 0 R 3367 0 R 3375 0 R 3393 0 R 3405 0 R 3411 0 R 3427 0 R 3431 0 R 3436 0 R 3438 0 R 3445 0 R 3448 0 R 3453 0 R 3456 0 R 3458 0 R 3460 0 R 3462 0 R 3466 0 R 3484 0 R 3487 0 R 3492 0 R 3498 0 R 3508 0 R 3513 0 R 3523 0 R 3534 0 R 3541 0 R 3546 0 R 3553 0 R 3558 0 R 3561 0 R 3569 0 R 3573 0 R 3578 0 R 3583 0 R 3596 0 R 3599 0 R 3605 0 R 3611 0 R 3616 0 R 3626 0 R 3635 0 R 3641 0 R 3650 0 R 3659 0 R 3664 0 R 3670 0 R 3676 0 R 3681 0 R 3683 0 R 3689 0 R 3696 0 R 3698 0 R 3706 0 R 3708 0 R 3714 0 R 3722 0 R 3728 0 R 3737 0 R 3743 0 R 3754 0 R 3763 0 R 3775 0 R 3785 0 R 3796 0 R 3800 0 R 3802 0 R 3806 0 R 3819 0 R 3825 0 R 3830 0 R 3836 0 R 3840 0 R 3843 0 R 3848 0 R 3850 0 R 3854 0 R 3856 0 R 3860 0 R 3863 0 R 3866 0 R 3874 0 R 3876 0 R 3882 0 R 3885 0 R 3891 0 R 3895 0 R 3898 0 R 3901 0 R 3904 0 R 3908 0 R 3911 0 R 3916 0 R 3921 0 R 3924 0 R
  3932 0 R 3936 0 R 3940 0 R 3942 0 R 3945 0 R 3948 0 R 3953 0 R 3960 0 R 3966 0 R 3970 0 R 3973 0 R 3980 0 R 3988 0 R 3992 0 R 3995 0 R 3997 0 R 4001 0 R 4006 0 R 4011 0 R 4014 0 R 4023 0 R 4028 0 R 4032 0 R 4035 0 R 4043 0 R 4048 0 R 4056 0 R 4061 0 R 4063 0 R 4069 0 R 4071 0 R 4076 0 R 4080 0 R 4085 0 R 4089 0 R 4101 0 R 4117 0 R 4132 0 R 4137 0 R 4140 0 R 4143 0 R 4149 0 R 4154 0 R 4156 0 R 4158 0 R 4160 0 R 4162 0 R 4164 0 R 4173 0 R 4177 0 R 4181 0 R 4185 0 R 4187 0 R 4194 0 R 4204 0 R 4211 0 R 4214 0 R 4217 0 R 4219 0 R 4226 0 R 4233 0 R 4244 0 R 4248 0 R 4251 0 R 4255 0 R 4258 0 R 4264 0 R 4267 0 R 4282 0 R 4287 0 R 4310 0 R 4314 0 R 4321 0 R 4332 0 R 4341 0 R 4344 0 R 4347 0 R 4350 0 R 4366 0 R 4371 0 R 4378 0 R 4381 0 R 4384 0 R 4391 0 R 4396 0 R 4400 0 R 4402 0 R 4408 0 R 4415 0 R 4423 0 R 4427 0 R 4432 0 R 4437 0 R 4443 0 R 4450 0 R 4457 0 R 4463 0 R 4471 0 R 4479 0 R 4483 0 R 4492 0 R 4500 0 R 4506 0 R]
 >>
 endobj
 4 0 obj
@@ -187,11 +187,11 @@ endobj
 << /Type /Font
 /BaseFont /71be00+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 5261 0 R
+/FontDescriptor 5262 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5263 0 R
-/ToUnicode 5262 0 R
+/Widths 5264 0 R
+/ToUnicode 5263 0 R
 >>
 endobj
 11 0 obj
@@ -1750,7 +1750,7 @@ endobj
 /F1.0 10 0 R
 >>
 >>
-/Annots [4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R 4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R 4523 0 R 4524 0 R 4525 0 R 4526 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R 4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R 4540 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R 4565 0 R 4566 0 R 4567 0 R 4568 0 R 4569 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R 4575 0 R 4576 0 R 4577 0 R 4578 0 R 4579 0 R 4580 0 R 4581 0 R]
+/Annots [4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R 4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R 4523 0 R 4524 0 R 4525 0 R 4526 0 R 4527 0 R 4528 0 R 4529 0 R 4530 0 R 4531 0 R 4532 0 R 4533 0 R 4534 0 R 4535 0 R 4536 0 R 4537 0 R 4538 0 R 4539 0 R 4540 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R 4565 0 R 4566 0 R 4567 0 R 4568 0 R 4569 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R 4575 0 R 4576 0 R 4577 0 R 4578 0 R 4579 0 R 4580 0 R 4581 0 R 4582 0 R]
 >>
 endobj
 13 0 obj
@@ -3417,7 +3417,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4582 0 R 4583 0 R 4584 0 R 4585 0 R 4586 0 R 4587 0 R 4588 0 R 4589 0 R 4590 0 R 4591 0 R 4592 0 R 4593 0 R 4594 0 R 4595 0 R 4596 0 R 4597 0 R 4598 0 R 4599 0 R 4600 0 R 4601 0 R 4602 0 R 4603 0 R 4604 0 R 4605 0 R 4606 0 R 4607 0 R 4608 0 R 4609 0 R 4610 0 R 4611 0 R 4612 0 R 4613 0 R 4614 0 R 4615 0 R 4616 0 R 4617 0 R 4618 0 R 4619 0 R 4620 0 R 4621 0 R 4622 0 R 4623 0 R 4624 0 R 4625 0 R 4626 0 R 4627 0 R 4628 0 R 4629 0 R 4630 0 R 4631 0 R 4632 0 R 4633 0 R 4634 0 R 4635 0 R 4636 0 R 4637 0 R 4638 0 R 4639 0 R 4640 0 R 4641 0 R 4642 0 R 4643 0 R 4644 0 R 4645 0 R 4646 0 R 4647 0 R 4648 0 R 4649 0 R 4650 0 R 4651 0 R 4652 0 R 4653 0 R 4654 0 R 4655 0 R 4656 0 R 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R]
+/Annots [4583 0 R 4584 0 R 4585 0 R 4586 0 R 4587 0 R 4588 0 R 4589 0 R 4590 0 R 4591 0 R 4592 0 R 4593 0 R 4594 0 R 4595 0 R 4596 0 R 4597 0 R 4598 0 R 4599 0 R 4600 0 R 4601 0 R 4602 0 R 4603 0 R 4604 0 R 4605 0 R 4606 0 R 4607 0 R 4608 0 R 4609 0 R 4610 0 R 4611 0 R 4612 0 R 4613 0 R 4614 0 R 4615 0 R 4616 0 R 4617 0 R 4618 0 R 4619 0 R 4620 0 R 4621 0 R 4622 0 R 4623 0 R 4624 0 R 4625 0 R 4626 0 R 4627 0 R 4628 0 R 4629 0 R 4630 0 R 4631 0 R 4632 0 R 4633 0 R 4634 0 R 4635 0 R 4636 0 R 4637 0 R 4638 0 R 4639 0 R 4640 0 R 4641 0 R 4642 0 R 4643 0 R 4644 0 R 4645 0 R 4646 0 R 4647 0 R 4648 0 R 4649 0 R 4650 0 R 4651 0 R 4652 0 R 4653 0 R 4654 0 R 4655 0 R 4656 0 R 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R 4664 0 R]
 >>
 endobj
 15 0 obj
@@ -5084,7 +5084,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4664 0 R 4665 0 R 4666 0 R 4667 0 R 4668 0 R 4669 0 R 4670 0 R 4671 0 R 4672 0 R 4673 0 R 4674 0 R 4675 0 R 4676 0 R 4677 0 R 4678 0 R 4679 0 R 4680 0 R 4681 0 R 4682 0 R 4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R 4696 0 R 4697 0 R 4698 0 R 4699 0 R 4700 0 R 4701 0 R 4702 0 R 4703 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R 4713 0 R 4714 0 R 4715 0 R 4716 0 R 4717 0 R 4718 0 R 4719 0 R 4720 0 R 4721 0 R 4722 0 R 4723 0 R 4724 0 R 4725 0 R 4726 0 R 4727 0 R 4728 0 R 4729 0 R 4730 0 R 4731 0 R 4732 0 R 4733 0 R 4734 0 R 4735 0 R 4736 0 R 4737 0 R 4738 0 R 4739 0 R 4740 0 R 4741 0 R 4742 0 R 4743 0 R 4744 0 R 4745 0 R]
+/Annots [4665 0 R 4666 0 R 4667 0 R 4668 0 R 4669 0 R 4670 0 R 4671 0 R 4672 0 R 4673 0 R 4674 0 R 4675 0 R 4676 0 R 4677 0 R 4678 0 R 4679 0 R 4680 0 R 4681 0 R 4682 0 R 4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R 4696 0 R 4697 0 R 4698 0 R 4699 0 R 4700 0 R 4701 0 R 4702 0 R 4703 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R 4713 0 R 4714 0 R 4715 0 R 4716 0 R 4717 0 R 4718 0 R 4719 0 R 4720 0 R 4721 0 R 4722 0 R 4723 0 R 4724 0 R 4725 0 R 4726 0 R 4727 0 R 4728 0 R 4729 0 R 4730 0 R 4731 0 R 4732 0 R 4733 0 R 4734 0 R 4735 0 R 4736 0 R 4737 0 R 4738 0 R 4739 0 R 4740 0 R 4741 0 R 4742 0 R 4743 0 R 4744 0 R 4745 0 R 4746 0 R]
 >>
 endobj
 17 0 obj
@@ -6751,7 +6751,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4746 0 R 4747 0 R 4748 0 R 4749 0 R 4750 0 R 4751 0 R 4752 0 R 4753 0 R 4754 0 R 4755 0 R 4756 0 R 4757 0 R 4758 0 R 4759 0 R 4760 0 R 4761 0 R 4762 0 R 4763 0 R 4764 0 R 4765 0 R 4766 0 R 4767 0 R 4768 0 R 4769 0 R 4770 0 R 4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R 4787 0 R 4788 0 R 4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R 4799 0 R 4800 0 R 4801 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R]
+/Annots [4747 0 R 4748 0 R 4749 0 R 4750 0 R 4751 0 R 4752 0 R 4753 0 R 4754 0 R 4755 0 R 4756 0 R 4757 0 R 4758 0 R 4759 0 R 4760 0 R 4761 0 R 4762 0 R 4763 0 R 4764 0 R 4765 0 R 4766 0 R 4767 0 R 4768 0 R 4769 0 R 4770 0 R 4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R 4787 0 R 4788 0 R 4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R 4799 0 R 4800 0 R 4801 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R]
 >>
 endobj
 19 0 obj
@@ -8429,7 +8429,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4828 0 R 4829 0 R 4830 0 R 4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4838 0 R 4839 0 R 4840 0 R 4841 0 R 4842 0 R 4843 0 R 4844 0 R 4845 0 R 4846 0 R 4847 0 R 4848 0 R 4849 0 R 4850 0 R 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4864 0 R 4865 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R 4874 0 R 4875 0 R 4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R 4884 0 R 4885 0 R 4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4899 0 R 4900 0 R 4901 0 R 4902 0 R 4903 0 R 4904 0 R 4905 0 R 4906 0 R 4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R]
+/Annots [4829 0 R 4830 0 R 4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4838 0 R 4839 0 R 4840 0 R 4841 0 R 4842 0 R 4843 0 R 4844 0 R 4845 0 R 4846 0 R 4847 0 R 4848 0 R 4849 0 R 4850 0 R 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4864 0 R 4865 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R 4874 0 R 4875 0 R 4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R 4884 0 R 4885 0 R 4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4899 0 R 4900 0 R 4901 0 R 4902 0 R 4903 0 R 4904 0 R 4905 0 R 4906 0 R 4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R 4912 0 R]
 >>
 endobj
 21 0 obj
@@ -10107,7 +10107,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4912 0 R 4913 0 R 4914 0 R 4915 0 R 4916 0 R 4917 0 R 4918 0 R 4919 0 R 4920 0 R 4921 0 R 4922 0 R 4923 0 R 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4956 0 R 4957 0 R 4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R 4985 0 R 4986 0 R 4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R]
+/Annots [4913 0 R 4914 0 R 4915 0 R 4916 0 R 4917 0 R 4918 0 R 4919 0 R 4920 0 R 4921 0 R 4922 0 R 4923 0 R 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4956 0 R 4957 0 R 4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R 4985 0 R 4986 0 R 4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R]
 >>
 endobj
 23 0 obj
@@ -10334,7 +10334,7 @@ endobj
 /Font << /F1.0 10 0 R
 >>
 >>
-/Annots [4996 0 R 4997 0 R 4998 0 R 4999 0 R 5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R]
+/Annots [4997 0 R 4998 0 R 4999 0 R 5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R 5006 0 R]
 >>
 endobj
 25 0 obj
@@ -11146,7 +11146,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [32 0 R 33 0 R 34 0 R 36 0 R 38 0 R 39 0 R 41 0 R 42 0 R 43 0 R]
@@ -11161,7 +11161,7 @@ endobj
 >>
 endobj
 29 0 obj
-<< /Kids [650 0 R 3747 0 R 1978 0 R 651 0 R 3678 0 R 1189 0 R 2608 0 R 3982 0 R]
+<< /Kids [651 0 R 3748 0 R 1979 0 R 652 0 R 3679 0 R 1190 0 R 2609 0 R 3983 0 R]
 >>
 endobj
 30 0 obj
@@ -11171,11 +11171,11 @@ endobj
 << /Type /Font
 /BaseFont /309344+NotoSerif-Bold
 /Subtype /TrueType
-/FontDescriptor 5265 0 R
+/FontDescriptor 5266 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5267 0 R
-/ToUnicode 5266 0 R
+/Widths 5268 0 R
+/ToUnicode 5267 0 R
 >>
 endobj
 32 0 obj
@@ -11215,11 +11215,11 @@ endobj
 << /Type /Font
 /BaseFont /fbe45d+NotoSerif-Italic
 /Subtype /TrueType
-/FontDescriptor 5269 0 R
+/FontDescriptor 5270 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5271 0 R
-/ToUnicode 5270 0 R
+/Widths 5272 0 R
+/ToUnicode 5271 0 R
 >>
 endobj
 36 0 obj
@@ -11237,11 +11237,11 @@ endobj
 << /Type /Font
 /BaseFont /c7d210+mplus1mn-regular
 /Subtype /TrueType
-/FontDescriptor 5273 0 R
+/FontDescriptor 5274 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5275 0 R
-/ToUnicode 5274 0 R
+/Widths 5276 0 R
+/ToUnicode 5275 0 R
 >>
 endobj
 38 0 obj
@@ -11267,11 +11267,11 @@ endobj
 << /Type /Font
 /BaseFont /6bc580+NotoSerif
 /Subtype /TrueType
-/FontDescriptor 5277 0 R
+/FontDescriptor 5278 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5279 0 R
-/ToUnicode 5278 0 R
+/Widths 5280 0 R
+/ToUnicode 5279 0 R
 >>
 endobj
 41 0 obj
@@ -11705,7 +11705,7 @@ endobj
 /F5.1 47 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -11714,11 +11714,11 @@ endobj
 << /Type /Font
 /BaseFont /26ec65+FontAwesome
 /Subtype /TrueType
-/FontDescriptor 5281 0 R
+/FontDescriptor 5282 0 R
 /FirstChar 32
 /LastChar 255
-/Widths 5283 0 R
-/ToUnicode 5282 0 R
+/Widths 5284 0 R
+/ToUnicode 5283 0 R
 >>
 endobj
 48 0 obj
@@ -11776,7 +11776,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -11861,7 +11861,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [54 0 R]
@@ -13434,7 +13434,7 @@ endobj
 /F1.1 40 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [59 0 R 61 0 R]
@@ -14554,7 +14554,7 @@ endobj
 /F1.0 10 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -15433,7 +15433,7 @@ endobj
 /F3.0 35 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [66 0 R]
@@ -16223,7 +16223,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -16942,7 +16942,7 @@ endobj
 /Font << /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -17818,7 +17818,7 @@ endobj
 /F2.0 31 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [75 0 R 76 0 R 77 0 R 78 0 R]
@@ -18808,7 +18808,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [81 0 R]
@@ -19731,7 +19731,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -21242,7 +21242,7 @@ endobj
 /F4.0 37 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [86 0 R 88 0 R]
@@ -22590,7 +22590,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [92 0 R]
@@ -23664,7 +23664,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -24387,7 +24387,7 @@ endobj
 /F1.0 10 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -25026,7 +25026,7 @@ endobj
 /F4.0 37 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [99 0 R 100 0 R 101 0 R 103 0 R]
@@ -25270,7 +25270,7 @@ endobj
 /Font << /F2.0 31 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [107 0 R 108 0 R 109 0 R 110 0 R]
@@ -26142,7 +26142,7 @@ endobj
 /F4.0 37 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [114 0 R 115 0 R]
@@ -26422,7 +26422,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -27902,7 +27902,7 @@ endobj
 /F5.1 47 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 130 0 R 131 0 R 132 0 R 133 0 R]
@@ -28942,7 +28942,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [136 0 R 138 0 R]
@@ -29695,7 +29695,7 @@ endobj
 /F2.0 31 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [141 0 R 143 0 R 144 0 R 145 0 R 146 0 R]
@@ -33665,7 +33665,7 @@ endobj
 /F2.0 31 0 R
 /F5.1 47 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R]
@@ -34622,7 +34622,7 @@ endobj
 /F2.0 31 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [158 0 R 159 0 R 163 0 R]
@@ -34655,12 +34655,12 @@ endobj
 endobj
 161 0 obj
 << /Limits [(__anchor-top) (adding.new.node)]
-/Names [(__anchor-top) 27 0 R (__indexterm-2002) 3643 0 R (__indexterm-2004) 3645 0 R (__indexterm-2006) 3647 0 R (__indexterm-2008) 3650 0 R (accesscontrolclient-changes) 4503 0 R (acid) 962 0 R (acl) 3445 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3745 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3748 0 R (add.metrics) 3743 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 4085 0 R (adding.new.node) 3186 0 R]
+/Names [(__anchor-top) 27 0 R (__indexterm-2002) 3644 0 R (__indexterm-2004) 3646 0 R (__indexterm-2006) 3648 0 R (__indexterm-2008) 3651 0 R (accesscontrolclient-changes) 4504 0 R (acid) 963 0 R (acl) 3446 0 R (add-metric-name-and-function-to-hadoop-compat-interface) 3746 0 R (add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules) 3749 0 R (add.metrics) 3744 0 R (adding-a-new-chapter-to-the-hbase-reference-guide) 4086 0 R (adding.new.node) 3187 0 R]
 >>
 endobj
 162 0 obj
 << /Limits [(io.storefile.bloom.block.size) (jdk-version-requirements)]
-/Names [(io.storefile.bloom.block.size) 365 0 R (ipc) 4411 0 R (irbrc) 825 0 R (irc) 3477 0 R (isolate-system-tables) 3439 0 R (java) 121 0 R (java-2) 1981 0 R (java-3) 1986 0 R (java.client.config) 525 0 R (jdk-issues) 2984 0 R (jdk-version-requirements) 58 0 R]
+/Names [(io.storefile.bloom.block.size) 365 0 R (ipc) 4412 0 R (irbrc) 826 0 R (irc) 3478 0 R (isolate-system-tables) 3440 0 R (java) 121 0 R (java-2) 1982 0 R (java-3) 1987 0 R (java.client.config) 526 0 R (jdk-issues) 2985 0 R (jdk-version-requirements) 58 0 R]
 >>
 endobj
 163 0 obj
@@ -34782,7 +34782,7 @@ endobj
 /F1.0 10 0 R
 /F2.0 31 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [166 0 R]
@@ -35916,7 +35916,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [171 0 R 172 0 R 174 0 R]
@@ -36716,7 +36716,7 @@ endobj
 /F5.1 47 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [179 0 R 180 0 R 181 0 R 183 0 R 184 0 R 186 0 R 187 0 R]
@@ -38188,7 +38188,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [190 0 R 191 0 R]
@@ -38613,7 +38613,7 @@ endobj
 /F4.0 37 0 R
 /F3.0 35 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -39269,7 +39269,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [197 0 R]
@@ -40036,7 +40036,7 @@ endobj
 /F4.0 37 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [202 0 R]
@@ -40567,7 +40567,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -40583,7 +40583,7 @@ endobj
 endobj
 212 0 obj
 << /Limits [(getshortmidpointkey-an-optimization-for-data-index-block) (handling-of-errors-during-log-splitting)]
-/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 4264 0 R (getting.involved) 3466 0 R (getting_started) 50 0 R (git.best.practices) 3749 0 R (git.patch.flow) 3811 0 R (goals) 4357 0 R (guide-for-hbase-committers) 3776 0 R (guidelines-for-deploying-a-coprocessor) 2446 0 R (guidelines-for-reporting-effective-issues) 3484 0 R (hadoop) 142 0 R (hadoop.native.lib) 4182 0 R (hadoop.policy.file) 391 0 R (handling-of-errors-during-log-splitting) 1719 0 R]
+/Names [(getshortmidpointkey-an-optimization-for-data-index-block) 4265 0 R (getting.involved) 3467 0 R (getting_started) 50 0 R (git.best.practices) 3750 0 R (git.patch.flow) 3812 0 R (goals) 4358 0 R (guide-for-hbase-committers) 3777 0 R (guidelines-for-deploying-a-coprocessor) 2447 0 R (guidelines-for-reporting-effective-issues) 3485 0 R (hadoop) 142 0 R (hadoop.native.lib) 4183 0 R (hadoop.policy.file) 391 0 R (handling-of-errors-during-log-splitting) 1720 0 R]
 >>
 endobj
 213 0 obj
@@ -41113,7 +41113,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -41635,7 +41635,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -41645,7 +41645,7 @@ endobj
 endobj
 227 0 obj
 << /Limits [(hbase.master.logcleaner.ttl) (hbase.mob.file.cache.size)]
-/Names [(hbase.master.logcleaner.ttl) 219 0 R (hbase.master.mob.ttl.cleaner.period) 504 0 R (hbase.master.normalizer.class) 473 0 R (hbase.master.port) 213 0 R (hbase.master.procedurewalcleaner.ttl) 220 0 R (hbase.master.wait.on.service.seconds) 517 0 R (hbase.mob.cache.evict.period) 500 0 R (hbase.mob.cache.evict.remain.ratio) 501 0 R (hbase.mob.compaction.batch.size) 508 0 R (hbase.mob.compaction.chore.period) 509 0 R (hbase.mob.compaction.mergeable.threshold) 505 0 R (hbase.mob.compaction.threads.max) 513 0 R (hbase.mob.compactor.class) 510 0 R (hbase.mob.delfile.max.count) 506 0 R (hbase.mob.file.cache.size) 499 0 R]
+/Names [(hbase.master.logcleaner.ttl) 219 0 R (hbase.master.mob.ttl.cleaner.period) 505 0 R (hbase.master.normalizer.class) 474 0 R (hbase.master.port) 213 0 R (hbase.master.procedurewalcleaner.ttl) 220 0 R (hbase.master.wait.on.service.seconds) 518 0 R (hbase.mob.cache.evict.period) 501 0 R (hbase.mob.cache.evict.remain.ratio) 504 0 R (hbase.mob.compaction.batch.size) 509 0 R (hbase.mob.compaction.chore.period) 512 0 R (hbase.mob.compaction.mergeable.threshold) 506 0 R (hbase.mob.compaction.threads.max) 514 0 R (hbase.mob.compactor.class) 513 0 R (hbase.mob.delfile.max.count) 507 0 R (hbase.mob.file.cache.size) 500 0 R]
 >>
 endobj
 228 0 obj
@@ -42270,7 +42270,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -42779,7 +42779,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -42801,7 +42801,7 @@ endobj
 endobj
 245 0 obj
 << /Limits [(hbase.regionserver.kerberos.principal) (hbase.regionserver.thread.compaction.throttle)]
-/Names [(hbase.regionserver.kerberos.principal) 390 0 R (hbase.regionserver.keytab.file) 389 0 R (hbase.regionserver.logroll.errors.tolerated) 241 0 R (hbase.regionserver.logroll.period) 240 0 R (hbase.regionserver.majorcompaction.pagecache.drop) 344 0 R (hbase.regionserver.minorcompaction.pagecache.drop) 347 0 R (hbase.regionserver.msginterval) 237 0 R (hbase.regionserver.optionalcacheflushinterval) 250 0 R (hbase.regionserver.port) 226 0 R (hbase.regionserver.region.split.policy) 253 0 R (hbase.regionserver.regionSplitLimit) 254 0 R (hbase.regionserver.storefile.refresh.period) 486 0 R (hbase.regionserver.thread.compaction.throttle) 343 0 R]
+/Names [(hbase.regionserver.kerberos.principal) 390 0 R (hbase.regionserver.keytab.file) 389 0 R (hbase.regionserver.logroll.errors.tolerated) 241 0 R (hbase.regionserver.logroll.period) 240 0 R (hbase.regionserver.majorcompaction.pagecache.drop) 344 0 R (hbase.regionserver.minorcompaction.pagecache.drop) 347 0 R (hbase.regionserver.msginterval) 237 0 R (hbase.regionserver.optionalcacheflushinterval) 250 0 R (hbase.regionserver.port) 226 0 R (hbase.regionserver.region.split.policy) 253 0 R (hbase.regionserver.regionSplitLimit) 254 0 R (hbase.regionserver.storefile.refresh.period) 489 0 R (hbase.regionserver.thread.compaction.throttle) 343 0 R]
 >>
 endobj
 246 0 obj
@@ -43310,7 +43310,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -43889,7 +43889,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [258 0 R 259 0 R]
@@ -44456,7 +44456,7 @@ endobj
 /F1.0 10 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [267 0 R 268 0 R 270 0 R 271 0 R]
@@ -44520,7 +44520,7 @@ endobj
 endobj
 274 0 obj
 << /Limits [(hbase.table.lock.enable) (hbase.tmp.dir)]
-/Names [(hbase.table.lock.enable) 418 0 R (hbase.table.max.rowsize) 419 0 R (hbase.tags) 1381 0 R (hbase.tests) 3626 0 R (hbase.tests.categories) 3670 0 R (hbase.tests.cluster) 3672 0 R (hbase.tests.example.code) 3673 0 R (hbase.tests.rules) 3666 0 R (hbase.tests.sleeps) 3671 0 R (hbase.tests.writing) 3665 0 R (hbase.thrift.maxQueuedRequests) 423 0 R (hbase.thrift.maxWorkerThreads) 422 0 R (hbase.thrift.minWorkerThreads) 421 0 R (hbase.tmp.dir) 204 0 R]
+/Names [(hbase.table.lock.enable) 418 0 R (hbase.table.max.rowsize) 419 0 R (hbase.tags) 1382 0 R (hbase.tests) 3627 0 R (hbase.tests.categories) 3671 0 R (hbase.tests.cluster) 3673 0 R (hbase.tests.example.code) 3674 0 R (hbase.tests.rules) 3667 0 R (hbase.tests.sleeps) 3672 0 R (hbase.tests.writing) 3666 0 R (hbase.thrift.maxQueuedRequests) 423 0 R (hbase.thrift.maxWorkerThreads) 422 0 R (hbase.thrift.minWorkerThreads) 421 0 R (hbase.tmp.dir) 204 0 R]
 >>
 endobj
 275 0 obj
@@ -45076,7 +45076,7 @@ endobj
 /F1.0 10 0 R
 /F1.1 40 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -45671,7 +45671,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [291 0 R 292 0 R]
@@ -45691,7 +45691,7 @@ endobj
 endobj
 290 0 obj
 << /Limits [(hbase.cluster.distributed) (hbase.data.umask.enable)]
-/Names [(hbase.cluster.distributed) 206 0 R (hbase.column.max.version) 442 0 R (hbase.commit.msg.format) 4028 0 R (hbase.coordinated.state.manager.class) 484 0 R (hbase.coprocessor.abortonerror) 407 0 R (hbase.coprocessor.enabled) 402 0 R (hbase.coprocessor.master.classes) 406 0 R (hbase.coprocessor.region.classes) 405 0 R (hbase.coprocessor.user.enabled) 404 0 R (hbase.data.umask) 433 0 R (hbase.data.umask.enable) 432 0 R]
+/Names [(hbase.cluster.distributed) 206 0 R (hbase.column.max.version) 445 0 R (hbase.commit.msg.format) 4029 0 R (hbase.coordinated.state.manager.class) 485 0 R (hbase.coprocessor.abortonerror) 407 0 R (hbase.coprocessor.enabled) 402 0 R (hbase.coprocessor.master.classes) 406 0 R (hbase.coprocessor.region.classes) 405 0 R (hbase.coprocessor.user.enabled) 404 0 R (hbase.data.umask) 433 0 R (hbase.data.umask.enable) 432 0 R]
 >>
 endobj
 291 0 obj
@@ -46237,7 +46237,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -46728,7 +46728,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -47300,7 +47300,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -47846,7 +47846,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -47865,7 +47865,7 @@ endobj
 endobj
 323 0 obj
 << /Limits [(hbase.hstore.flusher.count) (hbase.lease.recovery.timeout)]
-/Names [(hbase.hstore.flusher.count) 325 0 R (hbase.hstore.time.to.purge.deletes) 340 0 R (hbase.http.filter.initializers) 490 0 R (hbase.http.max.threads) 492 0 R (hbase.http.staticuser.user) 497 0 R (hbase.ipc.client.fallback-to-simple-auth-allowed) 397 0 R (hbase.ipc.client.tcpnodelay) 376 0 R (hbase.ipc.server.callqueue.handler.factor) 232 0 R (hbase.ipc.server.callqueue.read.ratio) 235 0 R (hbase.ipc.server.callqueue.scan.ratio) 236 0 R (hbase.ipc.server.fallback-to-simple-auth-allowed) 398 0 R (hbase.lease.recovery.dfs.timeout) 441 0 R (hbase.lease.recovery.timeout) 440 0 R]
+/Names [(hbase.hstore.flusher.count) 325 0 R (hbase.hstore.time.to.purge.deletes) 340 0 R (hbase.http.filter.initializers) 491 0 R (hbase.http.max.threads) 493 0 R (hbase.http.staticuser.user) 498 0 R (hbase.ipc.client.fallback-to-simple-auth-allowed) 397 0 R (hbase.ipc.client.tcpnodelay) 376 0 R (hbase.ipc.server.callqueue.handler.factor) 232 0 R (hbase.ipc.server.callqueue.read.ratio) 235 0 R (hbase.ipc.server.callqueue.scan.ratio) 236 0 R (hbase.ipc.server.fallback-to-simple-auth-allowed) 398 0 R (hbase.lease.recovery.dfs.timeout) 442 0 R (hbase.lease.recovery.timeout) 441 0 R]
 >>
 endobj
 324 0 obj
@@ -48423,7 +48423,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -49043,7 +49043,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -49590,7 +49590,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -50113,7 +50113,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -50673,7 +50673,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [357 0 R]
@@ -51208,7 +51208,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 /Annots [363 0 R]
@@ -51233,7 +51233,7 @@ endobj
 endobj
 366 0 obj
 << /Limits [(quota) (regions.arch)]
-/Names [(quota) 3299 0 R (read-api-and-usage) 1982 0 R (read-hbase-shell-commands-from-a-command-file) 811 0 R (reading-filtering-and-sending-edits) 3279 0 R (reading_cells_with_labels) 1435 0 R (recommended.configurations.hdfs) 553 0 R (recommended_configurations) 548 0 R (recommended_configurations.zk) 549 0 R (references) 3916 0 R (region-overlap-repairs) 4140 0 R (region-replication-for-meta-table-s-region) 1959 0 R (region-scanner-changes) 4483 0 R (region-transition-rpc-and-rs-heartbeat-can-arrive-at-same-time-on-master) 3949 0 R (regioncoprocessorenvironment-getregion-abstract-hregion) 4408 0 R (regioncoprocessorhost-postappend-append-append-result-result-void) 4409 0 R (regioncoprocessorhost-prestorefilereaderopen-filesystem-fs-path-p-fsdatainputstreamwrapper-in-long-size-cacheconfig-cacheconf-reference-r-storefile-reader) 4410 0 R (regionobserver) 4396 0 R (regions.arch) 1753 0 R]
+/Names [(quota) 3300 0 R (read-api-and-usage) 1983 0 R (read-hbase-shell-commands-from-a-command-file) 812 0 R (reading-filtering-and-sending-edits) 3280 0 R (reading_cells_with_labels) 1436 0 R (recommended.configurations.hdfs) 554 0 R (recommended_configurations) 549 0 R (recommended_configurations.zk) 550 0 R (references) 3917 0 R (region-overlap-repairs) 4141 0 R (region-replication-for-meta-table-s-region) 1960 0 R (region-scanner-changes) 4484 0 R (region-transition-rpc-and-rs-heartbeat-can-arrive-at-same-time-on-master) 3950 0 R (regioncoprocessorenvironment-getregion-abstract-hregion) 4409 0 R (regioncoprocessorhost-postappend-append-append-result-result-void) 4410 0 R (regioncoprocessorhost-prestorefilereaderopen-filesystem-fs-path-p-fsdatainputstreamwrapper-in-long-size-cacheconfig-cacheconf-reference-r-storefile-reader) 4411 0 R (regionobserver) 4397 0 R (regions.arch) 1754 0 R]
 >>
 endobj
 367 0 obj
@@ -51250,7 +51250,7 @@ endobj
 endobj
 371 0 obj
 << /Limits [(hbase.client.max.perregion.tasks) (hbase.client.write.buffer)]
-/Names [(hbase.client.max.perregion.tasks) 288 0 R (hbase.client.max.perserver.tasks) 287 0 R (hbase.client.max.total.tasks) 286 0 R (hbase.client.operation.timeout) 369 0 R (hbase.client.pause) 281 0 R (hbase.client.pause.cqtbe) 282 0 R (hbase.client.perserver.requests.threshold) 289 0 R (hbase.client.retries.number) 283 0 R (hbase.client.scanner.caching) 293 0 R (hbase.client.scanner.max.result.size) 453 0 R (hbase.client.scanner.timeout.period) 298 0 R (hbase.client.write.buffer) 280 0 R]
+/Names [(hbase.client.max.perregion.tasks) 288 0 R (hbase.client.max.perserver.tasks) 287 0 R (hbase.client.max.total.tasks) 286 0 R (hbase.client.operation.timeout) 369 0 R (hbase.client.pause) 281 0 R (hbase.client.pause.cqtbe) 282 0 R (hbase.client.perserver.requests.threshold) 289 0 R (hbase.client.retries.number) 283 0 R (hbase.client.scanner.caching) 293 0 R (hbase.client.scanner.max.result.size) 454 0 R (hbase.client.scanner.timeout.period) 298 0 R (hbase.client.write.buffer) 280 0 R]
 >>
 endobj
 372 0 obj
@@ -51872,7 +51872,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 /Annots [377 0 R 378 0 R 380 0 R 383 0 R 384 0 R]
@@ -51883,7 +51883,7 @@ endobj
 endobj
 375 0 obj
 << /Limits [(hbase.regionserver.thrift.compact) (hbase.rootdir.perms)]
-/Names [(hbase.regionserver.thrift.compact) 428 0 R (hbase.regionserver.thrift.framed) 424 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 427 0 R (hbase.release.announcement) 3605 0 R (hbase.replication.management) 3249 0 R (hbase.replication.rpc.codec) 493 0 R (hbase.replication.source.maxthreads) 494 0 R (hbase.rest-csrf.browser-useragents-regex) 477 0 R (hbase.rest.csrf.enabled) 476 0 R (hbase.rest.filter.classes) 465 0 R (hbase.rest.port) 410 0 R (hbase.rest.readonly) 411 0 R (hbase.rest.support.proxyuser) 414 0 R (hbase.rest.threads.max) 412 0 R (hbase.rest.threads.min) 413 0 R (hbase.rolling.restart) 642 0 R (hbase.rolling.upgrade) 638 0 R (hbase.rootdir) 205 0 R (hbase.rootdir.perms) 429 0 R]
+/Names [(hbase.regionserver.thrift.compact) 428 0 R (hbase.regionserver.thrift.framed) 424 0 R (hbase.regionserver.thrift.framed.max_frame_size_in_mb) 427 0 R (hbase.release.announcement) 3606 0 R (hbase.replication.management) 3250 0 R (hbase.replication.rpc.codec) 496 0 R (hbase.replication.source.maxthreads) 497 0 R (hbase.rest-csrf.browser-useragents-regex) 478 0 R (hbase.rest.csrf.enabled) 477 0 R (hbase.rest.filter.classes) 468 0 R (hbase.rest.port) 410 0 R (hbase.rest.readonly) 411 0 R (hbase.rest.support.proxyuser) 414 0 R (hbase.rest.threads.max) 412 0 R (hbase.rest.threads.min) 413 0 R (hbase.rolling.restart) 643 0 R (hbase.rolling.upgrade) 639 0 R (hbase.rootdir) 205 0 R (hbase.rootdir.perms) 429 0 R]
 >>
 endobj
 376 0 obj
@@ -51930,7 +51930,7 @@ endobj
 endobj
 382 0 obj
 << /Limits [(hbase.regionserver.dns.nameserver) (hbase.regionserver.info.port.auto)]
-/Names [(hbase.regionserver.dns.nameserver) 252 0 R (hbase.regionserver.global.memstore.size) 244 0 R (hbase.regionserver.global.memstore.size.lower.limit) 246 0 R (hbase.regionserver.handler.abort.on.error.percent) 498 0 R (hbase.regionserver.handler.count) 557 0 R (hbase.regionserver.handler.count) 231 0 R (hbase.regionserver.hlog.reader.impl) 242 0 R (hbase.regionserver.hlog.writer.impl) 243 0 R (hbase.regionserver.hostname) 379 0 R (hbase.regionserver.hostname.disable.master.reversedns) 381 0 R (hbase.regionserver.info.bindAddress) 229 0 R (hbase.regionserver.info.port) 228 0 R (hbase.regionserver.info.port.auto) 230 0 R]
+/Names [(hbase.regionserver.dns.nameserver) 252 0 R (hbase.regionserver.global.memstore.size) 244 0 R (hbase.regionserver.global.memstore.size.lower.limit) 246 0 R (hbase.regionserver.handler.abort.on.error.percent) 499 0 R (hbase.regionserver.handler.count) 558 0 R (hbase.regionserver.handler.count) 231 0 R (hbase.regionserver.hlog.reader.impl) 242 0 R (hbase.regionserver.hlog.writer.impl) 243 0 R (hbase.regionserver.hostname) 379 0 R (hbase.regionserver.hostname.disable.master.reversedns) 381 0 R (hbase.regionserver.info.bindAddress) 229 0 R (hbase.regionserver.info.port) 228 0 R (hbase.regionserver.info.port.auto) 230 0 R]
 >>
 endobj
 383 0 obj
@@ -52462,7 +52462,7 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -52996,7 +52996,7 @@ endobj
 /F3.0 35 0 R
 /F4.0 37 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -53546,7 +53546,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -53556,7 +53556,7 @@ endobj
 endobj
 403 0 obj
 << /Limits [(hbase.hregion.preclose.flush.size) (hbase.hstore.compactionThreshold)]
-/Names [(hbase.hregion.preclose.flush.size) 314 0 R (hbase.hstore.blockingStoreFiles) 328 0 R (hbase.hstore.blockingWaitTime) 329 0 R (hbase.hstore.bytes.per.checksum) 451 0 R (hbase.hstore.checksum.algorithm) 452 0 R (hbase.hstore.compaction.kv.max) 348 0 R (hbase.hstore.compaction.max) 331 0 R (hbase.hstore.compaction.max.size) 335 0 R (hbase.hstore.compaction.min) 330 0 R (hbase.hstore.compaction.min.size) 334 0 R (hbase.hstore.compaction.ratio) 336 0 R (hbase.hstore.compaction.ratio.offpeak) 337 0 R (hbase.hstore.compactionThreshold) 322 0 R]
+/Names [(hbase.hregion.preclose.flush.size) 314 0 R (hbase.hstore.blockingStoreFiles) 328 0 R (hbase.hstore.blockingWaitTime) 329 0 R (hbase.hstore.bytes.per.checksum) 452 0 R (hbase.hstore.checksum.algorithm) 453 0 R (hbase.hstore.compaction.kv.max) 348 0 R (hbase.hstore.compaction.max) 331 0 R (hbase.hstore.compaction.max.size) 335 0 R (hbase.hstore.compaction.min) 330 0 R (hbase.hstore.compaction.min.size) 334 0 R (hbase.hstore.compaction.ratio) 336 0 R (hbase.hstore.compaction.ratio.offpeak) 337 0 R (hbase.hstore.compactionThreshold) 322 0 R]
 >>
 endobj
 404 0 obj
@@ -54066,7 +54066,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -54599,7 +54599,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -54612,7 +54612,7 @@ endobj
 endobj
 420 0 obj
 << /Limits [(hbase.zookeeper.property.maxClientCnxns) (hbase_supported_tested_definitions)]
-/Names [(hbase.zookeeper.property.maxClientCnxns) 279 0 R (hbase.zookeeper.property.syncLimit) 273 0 R (hbase.zookeeper.quorum) 209 0 R (hbase_apis) 2200 0 R (hbase_default_configurations) 203 0 R (hbase_env) 537 0 R (hbase_metrics) 3191 0 R (hbase_mob) 1996 0 R (hbase_site) 533 0 R (hbase_supported_tested_definitions) 44 0 R]
+/Names [(hbase.zookeeper.property.maxClientCnxns) 279 0 R (hbase.zookeeper.property.syncLimit) 273 0 R (hbase.zookeeper.quorum) 209 0 R (hbase_apis) 2201 0 R (hbase_default_configurations) 203 0 R (hbase_env) 538 0 R (hbase_metrics) 3192 0 R (hbase_mob) 1997 0 R (hbase_site) 534 0 R (hbase_supported_tested_definitions) 44 0 R]
 >>
 endobj
 421 0 obj
@@ -55087,7 +55087,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
@@ -55103,7 +55103,7 @@ endobj
 endobj
 430 0 obj
 << /Limits [(hbase.rpc) (hbase.secure.spnego.ui)]
-/Names [(hbase.rpc) 4350 0 R (hbase.rpc.rows.warning.threshold) 516 0 R (hbase.rpc.shortoperation.timeout) 374 0 R (hbase.rpc.timeout) 368 0 R (hbase.rs.cacheblocksonwrite) 367 0 R (hbase.secure.bulkload) 1461 0 R (hbase.secure.configuration) 1301 0 R (hbase.secure.enable) 1465 0 R (hbase.secure.simpleconfiguration) 1343 0 R (hbase.secure.spnego.ui) 1296 0 R]
+/Names [(hbase.rpc) 4351 0 R (hbase.rpc.rows.warning.threshold) 517 0 R (hbase.rpc.shortoperation.timeout) 374 0 R (hbase.rpc.timeout) 368 0 R (hbase.rs.cacheblocksonwrite) 367 0 R (hbase.secure.bulkload) 1462 0 R (hbase.secure.configuration) 1302 0 R (hbase.secure.enable) 1466 0 R (hbase.secure.simpleconfiguration) 1344 0 R (hbase.secure.spnego.ui) 1297 0 R]
 >>
 endobj
 431 0 obj
@@ -55119,7 +55119,7 @@ endobj
 [426 0 R /XYZ 0 102.767 null]
 endobj
 435 0 obj
-<< /Length 8356
+<< /Length 8122
 >>
 stream
 q
@@ -55323,7 +55323,7 @@ ET
 BT
 48.24 480.475 Td
 /F4.0 10.5 Tf
-<68626173652e7365727665722e636f6d70616374636865636b65722e696e74657276616c2e6d756c7469706c696572> Tj
+<68626173652e736e617073686f742e776f726b696e672e646972> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55342,12 +55342,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.8172 Tw
+1.7764 Tw
 
 BT
 63.24 444.3 Td
 /F1.0 10.5 Tf
-[<546865206e756d62657220746861742064657465726d696e657320686f77206f6674656e207765207363616e20746f2073656520696620636f6d70616374696f6e206973206e6563657373617279> 89.8438 <2e204e6f726d616c6c79> 89.8438 <2c>] TJ
+<4c6f636174696f6e2077686572652074686520736e617073686f7474696e672070726f636573732077696c6c206f636375722e20546865206c6f636174696f6e206f662074686520636f6d706c6574656420736e617073686f7473> Tj
 ET
 
 
@@ -55357,12 +55357,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.5398 Tw
+1.2699 Tw
 
 BT
 63.24 428.52 Td
 /F1.0 10.5 Tf
-<636f6d70616374696f6e732061726520646f6e6520616674657220736f6d65206576656e7473202873756368206173206d656d73746f726520666c757368292c2062757420696620726567696f6e206469646ed57420726563656976652061> Tj
+[<77696c6c206e6f74206368616e67652c20627574207468652074656d706f72> 20.0195 <617279206469726563746f72792077686572652074686520736e617073686f742070726f63657373206f63637572732077696c6c2062652073657420746f>] TJ
 ET
 
 
@@ -55372,12 +55372,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.3262 Tw
+0.306 Tw
 
 BT
 63.24 412.74 Td
 /F1.0 10.5 Tf
-[<6c6f74206f662077726974657320666f7220736f6d652074696d652c206f722064756520746f20646966666572656e7420636f6d70616374696f6e20706f6c69636965732c206974206d61> 20.0195 <79206265206e656365737361727920746f20636865636b>] TJ
+[<74686973206c6f636174696f6e2e20546869732063616e2062652061207365706172> 20.0195 <6174652066696c6573797374656d207468616e2074686520726f6f74206469726563746f7279> 89.8438 <2c20666f7220706572666f726d616e636520696e637265617365>] TJ
 ET
 
 
@@ -55387,25 +55387,10 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.4806 Tw
-
 BT
 63.24 396.96 Td
 /F1.0 10.5 Tf
-[<697420706572696f646963616c6c79> 89.8438 <2e2054686520696e74657276616c206265747765656e20636865636b732069732068626173652e7365727665722e636f6d70616374636865636b> 20.0195 <65722e696e74657276616c2e6d756c7469706c696572>] TJ
-ET
-
-
-0.0 Tw
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-63.24 381.18 Td
-/F1.0 10.5 Tf
-[<6d756c7469706c6965642062> 20.0195 <792068626173652e7365727665722e7468726561642e77616b> 20.0195 <656672657175656e6379> 89.8438 <2e>] TJ
+[<707572706f7365732e20536565204842> 20.0195 <4153452d323130393820666f72206d6f726520696e666f726d6174696f6e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -55414,20 +55399,20 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 353.9982 Td
+63.24 369.7782 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
 
 BT
-63.24 336.593 Td
-/F4.0 10.5 Tf
-<31303030> Tj
+63.24 350.189 Td
+/F1.0 10.5 Tf
+<6e6f6e65> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55436,9 +55421,9 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 312.593 Td
+48.24 324.593 Td
 /F4.0 10.5 Tf
-<68626173652e6c656173652e7265636f766572792e74696d656f7574> Tj
+<68626173652e7365727665722e636f6d70616374636865636b65722e696e74657276616c2e6d756c7469706c696572> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55447,7 +55432,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 296.0072 Td
+63.24 308.0072 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -55457,67 +55442,57 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+1.8172 Tw
+
 BT
-63.24 276.418 Td
+63.24 288.418 Td
 /F1.0 10.5 Tf
-<486f77206c6f6e672077652077616974206f6e20646673206c65617365207265636f7665727920696e20746f74616c206265666f726520676976696e672075702e> Tj
+[<546865206e756d62657220746861742064657465726d696e657320686f77206f6674656e207765207363616e20746f2073656520696620636f6d70616374696f6e206973206e6563657373617279> 89.8438 <2e204e6f726d616c6c79> 89.8438 <2c>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-BT
-63.24 249.2362 Td
-/F3.0 9.975 Tf
-<44656661756c74> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
+0.5398 Tw
 
 BT
-63.24 231.831 Td
-/F4.0 10.5 Tf
-<393030303030> Tj
+63.24 272.638 Td
+/F1.0 10.5 Tf
+<636f6d70616374696f6e732061726520646f6e6520616674657220736f6d65206576656e7473202873756368206173206d656d73746f726520666c757368292c2062757420696620726567696f6e206469646ed57420726563656976652061> Tj
 ET
 
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
-
-BT
-48.24 207.831 Td
-/F4.0 10.5 Tf
-<68626173652e6c656173652e7265636f766572792e6466732e74696d656f7574> Tj
-ET
 
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.3262 Tw
+
 BT
-63.24 191.2452 Td
-/F3.0 9.975 Tf
-<4465736372697074696f6e> Tj
+63.24 256.858 Td
+/F1.0 10.5 Tf
+[<6c6f74206f662077726974657320666f7220736f6d652074696d652c206f722064756520746f20646966666572656e7420636f6d70616374696f6e20706f6c69636965732c206974206d61> 20.0195 <79206265206e656365737361727920746f20636865636b>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.2634 Tw
+1.4806 Tw
 
 BT
-63.24 171.656 Td
+63.24 241.078 Td
 /F1.0 10.5 Tf
-<486f77206c6f6e67206265747765656e20646673207265636f766572206c6561736520696e766f636174696f6e732e2053686f756c64206265206c6172676572207468616e207468652073756d206f66207468652074696d65206974> Tj
+[<697420706572696f646963616c6c79> 89.8438 <2e2054686520696e74657276616c206265747765656e20636865636b732069732068626173652e7365727665722e636f6d70616374636865636b> 20.0195 <65722e696e74657276616c2e6d756c7469706c696572>] TJ
 ET
 
 
@@ -55527,55 +55502,65 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-6.5352 Tw
-
 BT
-63.24 155.876 Td
+63.24 225.298 Td
 /F1.0 10.5 Tf
-[<74616b> 20.0195 <657320666f7220746865206e616d656e6f646520746f206973737565206120626c6f636b207265636f7665727920636f6d6d616e642061732070617274206f6620646174616e6f64653b>] TJ
+[<6d756c7469706c6965642062> 20.0195 <792068626173652e7365727665722e7468726561642e77616b> 20.0195 <656672657175656e6379> 89.8438 <2e>] TJ
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.1288 Tw
+BT
+63.24 198.1162 Td
+/F3.0 9.975 Tf
+<44656661756c74> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 140.096 Td
-/F1.0 10.5 Tf
-[<6466732e6865617274626561742e696e74657276616c20616e64207468652074696d652069742074616b> 20.0195 <657320666f7220746865207072696d61727920646174616e6f64652c20706572666f726d696e6720626c6f636b207265636f76657279>] TJ
+63.24 180.711 Td
+/F4.0 10.5 Tf
+<31303030> Tj
 ET
 
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
+
+BT
+48.24 156.711 Td
+/F4.0 10.5 Tf
+<68626173652e6c656173652e7265636f766572792e74696d656f7574> Tj
+ET
 
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.6366 Tw
-
 BT
-63.24 124.316 Td
-/F1.0 10.5 Tf
-[<746f2074696d656f7574206f6e2061206465616420646174616e6f64653b20757375616c6c79206466732e636c69656e742e736f636b> 20.0195 <65742d74696d656f75742e205365652074686520656e64206f66204842> 20.0195 <4153452d3833383920666f72>] TJ
+63.24 140.1252 Td
+/F3.0 9.975 Tf
+<4465736372697074696f6e> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-63.24 108.536 Td
+63.24 120.536 Td
 /F1.0 10.5 Tf
-<6d6f72652e> Tj
+<486f77206c6f6e672077652077616974206f6e20646673206c65617365207265636f7665727920696e20746f74616c206265666f726520676976696e672075702e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55584,7 +55569,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 81.3542 Td
+63.24 93.3542 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -55595,9 +55580,9 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 63.949 Td
+63.24 75.949 Td
 /F4.0 10.5 Tf
-<3634303030> Tj
+<393030303030> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55640,7 +55625,7 @@ endobj
 /F4.0 37 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp2 5007 0 R
+/XObject << /Stamp2 5008 0 R
 >>
 >>
 >>
@@ -55655,16 +55640,16 @@ endobj
 [436 0 R /XYZ 0 490.255 null]
 endobj
 440 0 obj
-[436 0 R /XYZ 0 322.373 null]
+[436 0 R /XYZ 0 334.373 null]
 endobj
 441 0 obj
-[436 0 R /XYZ 0 217.611 null]
+[436 0 R /XYZ 0 166.491 null]
 endobj
 442 0 obj
-[436 0 R /XYZ 0 49.729 null]
+[436 0 R /XYZ 0 61.729 null]
 endobj
 443 0 obj
-<< /Length 9392
+<< /Length 8585
 >>
 stream
 q
@@ -55676,7 +55661,7 @@ q
 BT
 48.24 796.11 Td
 /F4.0 10.5 Tf
-<68626173652e636f6c756d6e2e6d61782e76657273696f6e> Tj
+<68626173652e6c656173652e7265636f766572792e6466732e74696d656f7574> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55695,65 +55680,70 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+1.2634 Tw
+
 BT
 63.24 759.935 Td
 /F1.0 10.5 Tf
-[<4e657720636f6c756d6e2066616d696c792064657363726970746f72732077696c6c2075736520746869732076616c7565206173207468652064656661756c74206e756d626572206f662076657273696f6e7320746f206b> 20.0195 <6565702e>] TJ
+<486f77206c6f6e67206265747765656e20646673207265636f766572206c6561736520696e766f636174696f6e732e2053686f756c64206265206c6172676572207468616e207468652073756d206f66207468652074696d65206974> Tj
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-BT
-63.24 732.7532 Td
-/F3.0 9.975 Tf
-<44656661756c74> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
+6.5352 Tw
 
 BT
-63.24 715.348 Td
-/F4.0 10.5 Tf
-<31> Tj
+63.24 744.155 Td
+/F1.0 10.5 Tf
+[<74616b> 20.0195 <657320666f7220746865206e616d656e6f646520746f206973737565206120626c6f636b207265636f7665727920636f6d6d616e642061732070617274206f6620646174616e6f64653b>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+0.1288 Tw
 
 BT
-48.24 691.348 Td
-/F4.0 10.5 Tf
-<6466732e636c69656e742e726561642e73686f727463697263756974> Tj
+63.24 728.375 Td
+/F1.0 10.5 Tf
+[<6466732e6865617274626561742e696e74657276616c20616e64207468652074696d652069742074616b> 20.0195 <657320666f7220746865207072696d61727920646174616e6f64652c20706572666f726d696e6720626c6f636b207265636f76657279>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+0.6366 Tw
+
 BT
-63.24 674.7622 Td
-/F3.0 9.975 Tf
-<4465736372697074696f6e> Tj
+63.24 712.595 Td
+/F1.0 10.5 Tf
+[<746f2074696d656f7574206f6e2061206465616420646174616e6f64653b20757375616c6c79206466732e636c69656e742e736f636b> 20.0195 <65742d74696d656f75742e205365652074686520656e64206f66204842> 20.0195 <4153452d3833383920666f72>] TJ
 ET
 
+
+0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
 BT
-63.24 655.173 Td
+63.24 696.815 Td
 /F1.0 10.5 Tf
-[<49662073657420746f20747275652c207468697320636f6e6669677572> 20.0195 <6174696f6e20706172> 20.0195 <616d6574657220656e61626c65732073686f72742d63697263756974206c6f63616c2072656164732e>] TJ
+<6d6f72652e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55762,7 +55752,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 627.9912 Td
+63.24 669.6332 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -55773,9 +55763,9 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 610.586 Td
+63.24 652.228 Td
 /F4.0 10.5 Tf
-<66616c7365> Tj
+<3634303030> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55784,9 +55774,9 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 586.586 Td
+48.24 628.228 Td
 /F4.0 10.5 Tf
-<6466732e646f6d61696e2e736f636b65742e70617468> Tj
+<68626173652e636f6c756d6e2e6d61782e76657273696f6e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55795,7 +55785,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 570.0002 Td
+63.24 611.6422 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -55805,61 +55795,56 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.7551 Tw
-
 BT
-63.24 550.411 Td
+63.24 592.053 Td
 /F1.0 10.5 Tf
-[<546869732069732061207061746820746f206120554e495820646f6d61696e20736f636b> 20.0195 <657420746861742077696c6c206265207573656420666f7220636f6d6d756e69636174696f6e206265747765656e20746865>] TJ
+[<4e657720636f6c756d6e2066616d696c792064657363726970746f72732077696c6c2075736520746869732076616c7565206173207468652064656661756c74206e756d626572206f662076657273696f6e7320746f206b> 20.0195 <6565702e>] TJ
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.1764 Tw
-
 BT
-63.24 534.631 Td
-/F1.0 10.5 Tf
-[<446174614e6f646520616e64206c6f63616c204844465320636c69656e74732c206966206466732e636c69656e742e726561642e73686f7274636972637569742069732073657420746f20747275652e2049662074686520737472696e6720225f504f52> 20.0195 <5422>] TJ
+63.24 564.8712 Td
+/F3.0 9.975 Tf
+<44656661756c74> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-1.7233 Tw
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 518.851 Td
-/F1.0 10.5 Tf
-[<69732070726573656e7420696e207468697320706174682c2069742077696c6c206265207265706c616365642062> 20.0195 <79207468652054> 20.0195 <435020706f7274206f662074686520446174614e6f64652e204265206361726566756c2061626f7574>] TJ
+63.24 547.466 Td
+/F4.0 10.5 Tf
+<31> Tj
 ET
 
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
+
+BT
+48.24 523.466 Td
+/F4.0 10.5 Tf
+<6466732e636c69656e742e726561642e73686f727463697263756974> Tj
+ET
 
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.0162 Tw
-
 BT
-63.24 503.071 Td
-/F1.0 10.5 Tf
-[<7065726d697373696f6e7320666f7220746865206469726563746f7279207468617420686f737473207468652073686172656420646f6d61696e20736f636b> 20.0195 <65743b20646673636c69656e742077696c6c20636f6d706c61696e206966>] TJ
+63.24 506.8802 Td
+/F3.0 9.975 Tf
+<4465736372697074696f6e> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
@@ -55868,7 +55853,7 @@ ET
 BT
 63.24 487.291 Td
 /F1.0 10.5 Tf
-<6f70656e20746f206f74686572207573657273207468616e2074686520484261736520757365722e> Tj
+[<49662073657420746f20747275652c207468697320636f6e6669677572> 20.0195 <6174696f6e20706172> 20.0195 <616d6574657220656e61626c65732073686f72742d63697263756974206c6f63616c2072656164732e>] TJ
 ET
 
 0.0 0.0 0.0 SCN
@@ -55890,7 +55875,7 @@ ET
 BT
 63.24 442.704 Td
 /F4.0 10.5 Tf
-<6e6f6e65> Tj
+<66616c7365> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55901,7 +55886,7 @@ ET
 BT
 48.24 418.704 Td
 /F4.0 10.5 Tf
-<68626173652e6466732e636c69656e742e726561642e73686f7274636972637569742e6275666665722e73697a65> Tj
+<6466732e646f6d61696e2e736f636b65742e70617468> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -55920,12 +55905,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.3219 Tw
+2.7551 Tw
 
 BT
 63.24 382.529 Td
 /F1.0 10.5 Tf
-[<49662074686520444653436c69656e7420636f6e6669677572> 20.0195 <6174696f6e206466732e636c69656e742e726561642e73686f7274636972637569742e6275666665722e73697a6520697320756e7365742c2077652077696c6c207573652077686174206973>] TJ
+[<546869732069732061207061746820746f206120554e495820646f6d61696e20736f636b> 20.0195 <657420746861742077696c6c206265207573656420666f7220636f6d6d756e69636174696f6e206265747765656e20746865>] TJ
 ET
 
 
@@ -55935,12 +55920,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.4089 Tw
+0.1764 Tw
 
 BT
 63.24 366.749 Td
 /F1.0 10.5 Tf
-[<636f6e666967757265642068657265206173207468652073686f7274206369726375697420726561642064656661756c74206469726563742062> 20.0195 <797465206275666665722073697a652e20444653436c69656e74206e61746976652064656661756c74>] TJ
+[<446174614e6f646520616e64206c6f63616c204844465320636c69656e74732c206966206466732e636c69656e742e726561642e73686f7274636972637569742069732073657420746f20747275652e2049662074686520737472696e6720225f504f52> 20.0195 <5422>] TJ
 ET
 
 
@@ -55950,12 +55935,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-0.092 Tw
+1.7233 Tw
 
 BT
 63.24 350.969 Td
 /F1.0 10.5 Tf
-[<697320314d423b204842617365206b> 20.0195 <656570732069747320484446532066696c6573206f70656e20736f206e756d626572206f662066696c6520626c6f636b73202a20314d4220736f6f6e2073746172747320746f2061646420757020616e64>] TJ
+[<69732070726573656e7420696e207468697320706174682c2069742077696c6c206265207265706c616365642062> 20.0195 <79207468652054> 20.0195 <435020706f7274206f662074686520446174614e6f64652e204265206361726566756c2061626f7574>] TJ
 ET
 
 
@@ -55965,12 +55950,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.6085 Tw
+2.0162 Tw
 
 BT
 63.24 335.189 Td
 /F1.0 10.5 Tf
-[<746872656174656e204f4f4d452062656361757365206f6620612073686f7274616765206f6620646972656374206d656d6f7279> 89.8438 <2e20536f2c2077652073657420697420646f776e2066726f6d207468652064656661756c742e>] TJ
+[<7065726d697373696f6e7320666f7220746865206469726563746f7279207468617420686f737473207468652073686172656420646f6d61696e20736f636b> 20.0195 <65743b20646673636c69656e742077696c6c20636f6d706c61696e206966>] TJ
 ET
 
 
@@ -55983,7 +55968,7 @@ ET
 BT
 63.24 319.409 Td
 /F1.0 10.5 Tf
-[<4d616b> 20.0195 <65206974203e207468652064656661756c7420686261736520626c6f636b2073697a652073657420696e207468652048436f6c756d6e44657363726970746f7220776869636820697320757375616c6c792036346b2e>] TJ
+<6f70656e20746f206f74686572207573657273207468616e2074686520484261736520757365722e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -56005,7 +55990,7 @@ ET
 BT
 63.24 274.822 Td
 /F4.0 10.5 Tf
-<313331303732> Tj
+<6e6f6e65> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -56016,7 +56001,7 @@ ET
 BT
 48.24 250.822 Td
 /F4.0 10.5 Tf
-<68626173652e726567696f6e7365727665722e636865636b73756d2e766572696679> Tj
+<68626173652e6466732e636c69656e742e726561642e73686f7274636972637569742e6275666665722e73697a65> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -56035,12 +56020,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-4.0989 Tw
+0.3219 Tw
 
 BT
 63.24 214.647 Td
 /F1.0 10.5 Tf
-<49662073657420746f207472756520287468652064656661756c74292c2048426173652076657269666965732074686520636865636b73756d7320666f72206866696c6520626c6f636b732e20484261736520777269746573> Tj
+[<49662074686520444653436c69656e7420636f6e6669677572> 20.0195 <6174696f6e206466732e636c69656e742e726561642e73686f7274636972637569742e6275666665722e73697a6520697320756e7365742c2077652077696c6c207573652077686174206973>] TJ
 ET
 
 
@@ -56050,12 +56035,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.875 Tw
+0.4089 Tw
 
 BT
 63.24 198.867 Td
 /F1.0 10.5 Tf
-<636865636b73756d7320696e6c696e652077697468207468652064617461207768656e20697420777269746573206f7574206866696c65732e204844465320286173206f6620746869732077726974696e672920777269746573> Tj
+[<636f6e666967757265642068657265206173207468652073686f7274206369726375697420726561642064656661756c74206469726563742062> 20.0195 <797465206275666665722073697a652e20444653436c69656e74206e61746976652064656661756c74>] TJ
 ET
 
 
@@ -56065,12 +56050,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.1734 Tw
+0.092 Tw
 
 BT
 63.24 183.087 Td
 /F1.0 10.5 Tf
-[<636865636b73756d7320746f2061207365706172> 20.0195 <6174652066696c65207468616e2074686520646174612066696c65206e656365737369746174696e672065787472> 20.0195 <61207365656b732e2053657474696e67207468697320666c6167207361766573>] TJ
+[<697320314d423b204842617365206b> 20.0195 <656570732069747320484446532066696c6573206f70656e20736f206e756d626572206f662066696c6520626c6f636b73202a20314d4220736f6f6e2073746172747320746f2061646420757020616e64>] TJ
 ET
 
 
@@ -56080,12 +56065,12 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.1597 Tw
+1.6085 Tw
 
 BT
 63.24 167.307 Td
 /F1.0 10.5 Tf
-[<736f6d65206f6e20692f6f2e20436865636b73756d20766572696669636174696f6e2062> 20.0195 <7920484446532077696c6c20626520696e7465726e616c6c792064697361626c6564206f6e206866696c652073747265616d73207768656e>] TJ
+[<746872656174656e204f4f4d452062656361757365206f6620612073686f7274616765206f6620646972656374206d656d6f7279> 89.8438 <2e20536f2c2077652073657420697420646f776e2066726f6d207468652064656661756c742e>] TJ
 ET
 
 
@@ -56095,55 +56080,43 @@ ET
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-2.553 Tw
-
 BT
 63.24 151.527 Td
 /F1.0 10.5 Tf
-<7468697320666c6167206973207365742e204966207468652068626173652d636865636b73756d20766572696669636174696f6e206661696c732c2077652077696c6c20737769746368206261636b20746f207573696e672048444653> Tj
+[<4d616b> 20.0195 <65206974203e207468652064656661756c7420686261736520626c6f636b2073697a652073657420696e207468652048436f6c756d6e44657363726970746f7220776869636820697320757375616c6c792036346b2e>] TJ
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
-1.1933 Tw
-
 BT
-63.24 135.747 Td
-/F1.0 10.5 Tf
-[<636865636b73756d732028736f20646f206e6f742064697361626c65204844465320636865636b73756d732120416e64206265736964657320746869732066656174757265206170706c69657320746f206866696c6573206f6e6c79> 89.8438 <2c>] TJ
+63.24 124.3452 Td
+/F3.0 9.975 Tf
+<44656661756c74> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-0.5629 Tw
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 119.967 Td
-/F1.0 10.5 Tf
-[<6e6f7420746f2057> 60.0586 <414c73292e204966207468697320706172> 20.0195 <616d657465722069732073657420746f2066616c73652c207468656e2068626173652077696c6c206e6f742076657269667920616e> 20.0195 <7920636865636b73756d732c20696e7374656164>] TJ
+63.24 106.94 Td
+/F4.0 10.5 Tf
+<313331303732> Tj
 ET
 
-
-0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 104.187 Td
-/F1.0 10.5 Tf
-<69742077696c6c20646570656e64206f6e20636865636b73756d20766572696669636174696f6e206265696e6720646f6e6520696e20746865204844465320636c69656e742e> Tj
+48.24 82.94 Td
+/F4.0 10.5 Tf
+<68626173652e726567696f6e7365727665722e636865636b73756d2e766572696679> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -56152,20 +56125,9 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 77.0052 Td
+63.24 66.3542 Td
 /F3.0 9.975 Tf
-<44656661756c74> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-0.6941 0.1294 0.2745 scn
-0.6941 0.1294 0.2745 SCN
-
-BT
-63.24 59.6 Td
-/F4.0 10.5 Tf
-<74727565> Tj
+<4465736372697074696f6e> Tj
 ET
 
 0.0 0.0 0.0 SCN
@@ -56208,16 +56170,16 @@ endobj
 /F3.0 35 0 R
 /F1.0 10 0 R
 >>
-/XObject << /Stamp1 5006 0 R
+/XObject << /Stamp1 5007 0 R
 >>
 >>
 >>
 endobj
 445 0 obj
-[444 0 R /XYZ 0 701.128 null]
+[444 0 R /XYZ 0 638.008 null]
 endobj
 446 0 obj
-[444 0 R /XYZ 0 596.366 null]
+[444 0 R /XYZ 0 533.246 null]
 endobj
 447 0 obj
 [444 0 R /XYZ 0 428.484 null]
@@ -56226,17 +56188,158 @@ endobj
 [444 0 R /XYZ 0 260.602 null]
 endobj
 449 0 obj
-<< /Length 7812
+[444 0 R /XYZ 0 92.72 null]
+endobj
+450 0 obj
+<< /Length 8785
 >>
 stream
 q
 /DeviceRGB cs
-0.6941 0.1294 0.2745 scn
+0.2 0.2 0.2 scn
 /DeviceRGB CS
+0.2 0.2 0.2 SCN
+
+4.0989 Tw
+
+BT
+63.24 794.676 Td
+/F1.0 10.5 Tf
+<49662073657420746f207472756520287468652064656661756c74292c2048426173652076657269666965732074686520636865636b73756d7320666f72206866696c6520626c6f636b732e20484261736520777269746573> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+2.875 Tw
+
+BT
+63.24 778.896 Td
+/F1.0 10.5 Tf
+<636865636b73756d7320696e6c696e652077697468207468652064617461207768656e20697420777269746573206f7574206866696c65732e204844465320286173206f6620746869732077726974696e672920777269746573> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+1.1734 Tw
+
+BT
+63.24 763.116 Td
+/F1.0 10.5 Tf
+[<636865636b73756d7320746f2061207365706172> 20.0195 <6174652066696c65207468616e2074686520646174612066696c65206e656365737369746174696e672065787472> 20.0195 <61207365656b732e2053657474696e67207468697320666c6167207361766573>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+1.1597 Tw
+
+BT
+63.24 747.336 Td
+/F1.0 10.5 Tf
+[<736f6d65206f6e20692f6f2e20436865636b73756d20766572696669636174696f6e2062> 20.0195 <7920484446532077696c6c20626520696e7465726e616c6c792064697361626c6564206f6e206866696c652073747265616d73207768656e>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+2.553 Tw
+
+BT
+63.24 731.556 Td
+/F1.0 10.5 Tf
+<7468697320666c6167206973207365742e204966207468652068626173652d636865636b73756d20766572696669636174696f6e206661696c732c2077652077696c6c20737769746368206261636b20746f207573696e672048444653> Tj
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+1.1933 Tw
+
+BT
+63.24 715.776 Td
+/F1.0 10.5 Tf
+[<636865636b73756d732028736f20646f206e6f742064697361626c65204844465320636865636b73756d732120416e64206265736964657320746869732066656174757265206170706c69657320746f206866696c6573206f6e6c79> 89.8438 <2c>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+0.5629 Tw
+
+BT
+63.24 699.996 Td
+/F1.0 10.5 Tf
+[<6e6f7420746f2057> 60.0586 <414c73292e204966207468697320706172> 20.0195 <616d657465722069732073657420746f2066616c73652c207468656e2068626173652077696c6c206e6f742076657269667920616e> 20.0195 <7920636865636b73756d732c20696e7374656164>] TJ
+ET
+
+
+0.0 Tw
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+63.24 684.216 Td
+/F1.0 10.5 Tf
+<69742077696c6c20646570656e64206f6e20636865636b73756d20766572696669636174696f6e206265696e6720646f6e6520696e20746865204844465320636c69656e742e> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.2 0.2 0.2 scn
+0.2 0.2 0.2 SCN
+
+BT
+63.24 657.0342 Td
+/F3.0 9.975 Tf
+<44656661756c74> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.6941 0.1294 0.2745 scn
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 796.11 Td
+63.24 639.629 Td
+/F4.0 10.5 Tf
+<74727565> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+0.6941 0.1294 0.2745 scn
+0.6941 0.1294 0.2745 SCN
+
+BT
+48.24 615.629 Td
 /F4.0 10.5 Tf
 <68626173652e6873746f72652e62797465732e7065722e636865636b73756d> Tj
 ET
@@ -56247,7 +56350,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 779.5242 Td
+63.24 599.0432 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -56258,7 +56361,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 759.935 Td
+63.24 579.454 Td
 /F1.0 10.5 Tf
 [<4e756d626572206f662062> 20.0195 <7974657320696e2061206e65776c79206372656174656420636865636b73756d206368756e6b20666f722048426173652d6c6576656c20636865636b73756d7320696e206866696c6520626c6f636b732e>] TJ
 ET
@@ -56269,7 +56372,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 732.7532 Td
+63.24 552.2722 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -56280,7 +56383,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 715.348 Td
+63.24 534.867 Td
 /F4.0 10.5 Tf
 <3136333834> Tj
 ET
@@ -56291,7 +56394,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 691.348 Td
+48.24 510.867 Td
 /F4.0 10.5 Tf
 <68626173652e6873746f72652e636865636b73756d2e616c676f726974686d> Tj
 ET
@@ -56302,7 +56405,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 674.7622 Td
+63.24 494.2812 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -56315,7 +56418,7 @@ ET
 1.9779 Tw
 
 BT
-63.24 655.173 Td
+63.24 474.692 Td
 /F1.0 10.5 Tf
 [<4e616d65206f6620616e20616c676f726974686d2074686174206973207573656420746f20636f6d7075746520636865636b73756d732e20506f737369626c652076616c75657320617265204e554c4c2c204352> 20.0195 <4333322c>] TJ
 ET
@@ -56328,7 +56431,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 639.393 Td
+63.24 458.912 Td
 /F1.0 10.5 Tf
 [<4352> 20.0195 <433332432e>] TJ
 ET
@@ -56339,7 +56442,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 612.2112 Td
+63.24 431.7302 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -56350,7 +56453,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 594.806 Td
+63.24 414.325 Td
 /F4.0 10.5 Tf
 <435243333243> Tj
 ET
@@ -56361,7 +56464,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 570.806 Td
+48.24 390.325 Td
 /F4.0 10.5 Tf
 <68626173652e636c69656e742e7363616e6e65722e6d61782e726573756c742e73697a65> Tj
 ET
@@ -56372,7 +56475,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 554.2202 Td
+63.24 373.7392 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -56385,7 +56488,7 @@ ET
 1.2521 Tw
 
 BT
-63.24 534.631 Td
+63.24 354.15 Td
 /F1.0 10.5 Tf
 [<4d6178696d756d206e756d626572206f662062> 20.0195 <797465732072657475726e6564207768656e2063616c6c696e672061207363616e6e6572> -29.7852 <d573206e657874206d6574686f642e204e6f74652074686174207768656e2061>] TJ
 ET
@@ -56400,7 +56503,7 @@ ET
 0.3589 Tw
 
 BT
-63.24 518.851 Td
+63.24 338.37 Td
 /F1.0 10.5 Tf
 [<73696e676c6520726f77206973206c6172676572207468616e2074686973206c696d69742074686520726f77206973207374696c6c2072657475726e656420636f6d706c6574656c79> 89.8438 <2e205468652064656661756c742076616c756520697320324d422c>] TJ
 ET
@@ -56415,7 +56518,7 @@ ET
 0.9451 Tw
 
 BT
-63.24 503.071 Td
+63.24 322.59 Td
 /F1.0 10.5 Tf
 <776869636820697320676f6f6420666f7220316765206e6574776f726b732e20576974682066617374657220616e642f6f722068696768206c6174656e6379206e6574776f726b7320746869732076616c75652073686f756c64206265> Tj
 ET
@@ -56428,7 +56531,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 487.291 Td
+63.24 306.81 Td
 /F1.0 10.5 Tf
 <696e637265617365642e> Tj
 ET
@@ -56439,7 +56542,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 460.1092 Td
+63.24 279.6282 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -56450,7 +56553,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 442.704 Td
+63.24 262.223 Td
 /F4.0 10.5 Tf
 <32303937313532> Tj
 ET
@@ -56461,7 +56564,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 418.704 Td
+48.24 238.223 Td
 /F4.0 10.5 Tf
 <68626173652e7365727665722e7363616e6e65722e6d61782e726573756c742e73697a65> Tj
 ET
@@ -56472,7 +56575,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 402.1182 Td
+63.24 221.6372 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -56485,7 +56588,7 @@ ET
 1.2521 Tw
 
 BT
-63.24 382.529 Td
+63.24 202.048 Td
 /F1.0 10.5 Tf
 [<4d6178696d756d206e756d626572206f662062> 20.0195 <797465732072657475726e6564207768656e2063616c6c696e672061207363616e6e6572> -29.7852 <d573206e657874206d6574686f642e204e6f74652074686174207768656e2061>] TJ
 ET
@@ -56500,7 +56603,7 @@ ET
 2.1256 Tw
 
 BT
-63.24 366.749 Td
+63.24 186.268 Td
 /F1.0 10.5 Tf
 [<73696e676c6520726f77206973206c6172676572207468616e2074686973206c696d69742074686520726f77206973207374696c6c2072657475726e656420636f6d706c6574656c79> 89.8438 <2e205468652064656661756c742076616c7565206973>] TJ
 ET
@@ -56513,7 +56616,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 350.969 Td
+63.24 170.488 Td
 /F1.0 10.5 Tf
 <3130304d422e20546869732069732061207361666574792073657474696e6720746f2070726f7465637420746865207365727665722066726f6d204f4f4d20736974756174696f6e732e> Tj
 ET
@@ -56524,7 +56627,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 323.7872 Td
+63.24 143.3062 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -56535,7 +56638,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 306.382 Td
+63.24 125.901 Td
 /F4.0 10.5 Tf
 <313034383537363030> Tj
 ET
@@ -56546,7 +56649,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 282.382 Td
+48.24 101.901 Td
 /F4.0 10.5 Tf
 <68626173652e7374617475732e7075626c6973686564> Tj
 ET
@@ -56557,7 +56660,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 265.7962 Td
+63.24 85.3152 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -56570,7 +56673,7 @@ ET
 1.3356 Tw
 
 BT
-63.24 246.207 Td
+63.24 65.726 Td
 /F1.0 10.5 Tf
 [<546869732073657474696e672061637469766174657320746865207075626c69636174696f6e2062> 20.0195 <7920746865206d6173746572206f662074686520737461747573206f662074686520726567696f6e207365727665722e205768656e2061>] TJ
 ET
@@ -56579,13 +56682,78 @@ ET
 0.0 Tw
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
+q
+0.0 0.0 0.0 scn
+0.0 0.0 0.0 SCN
+1 w
+0 J
+0 j
+[] 0 d
+/Stamp2 Do
 0.2 0.2 0.2 scn
 0.2 0.2 0.2 SCN
 
+BT
+49.24 14.388 Td
+/F1.0 9 Tf
+<3632> Tj
+ET
+
+0.0 0.0 0.0 SCN
+0.0 0.0 0.0 scn
+Q
+Q
+
+endstream
+endobj
+451 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595.28 841.89]
+/CropBox [0 0 595.28 841.89]
+/BleedBox [0 0 595.28 841.89]
+/TrimBox [0 0 595.28 841.89]
+/ArtBox [0 0 595.28 841.89]
+/Contents 450 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 10 0 R
+/F3.0 35 0 R
+/F4.0 37 0 R
+>>
+/XObject << /Stamp2 5008 0 R
+>>
+>>
+>>
+endobj
+452 0 obj
+[451 0 R /XYZ 0 625.409 null]
+endobj
+453 0 obj
+[451 0 R /XYZ 0 520.647 null]
+endobj
+454 0 obj
+[451 0 R /XYZ 0 400.105 null]
+endobj
+455 0 obj
+[451 0 R /XYZ 0 248.003 null]
+endobj
+456 0 obj
+[451 0 R /XYZ 0 111.681 null]
+endobj
+457 0 obj
+<< /Length 7262
+>>
+stream
+q
+/DeviceRGB cs
+0.2 0.2 0.2 scn
+/DeviceRGB CS
+0.2 0.2 0.2 SCN
+
 1.7389 Tw
 
 BT
-63.24 230.427 Td
+63.24 794.676 Td
 /F1.0 10.5 Tf
 <726567696f6e20736572766572206469657320616e6420697473207265636f76657279207374617274732c20746865206d61737465722077696c6c2070757368207468697320696e666f726d6174696f6e20746f2074686520636c69656e74> Tj
 ET
@@ -56598,7 +56766,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 214.647 Td
+63.24 778.896 Td
 /F1.0 10.5 Tf
 <6170706c69636174696f6e2c20746f206c6574207468656d206375742074686520636f6e6e656374696f6e20696d6d6564696174656c7920696e7374656164206f662077616974696e6720666f7220612074696d656f75742e> Tj
 ET
@@ -56609,7 +56777,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 187.4652 Td
+63.24 751.7142 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -56620,7 +56788,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 170.06 Td
+63.24 734.309 Td
 /F4.0 10.5 Tf
 <66616c7365> Tj
 ET
@@ -56631,7 +56799,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 146.06 Td
+48.24 710.309 Td
 /F4.0 10.5 Tf
 <68626173652e7374617475732e7075626c69736865722e636c617373> Tj
 ET
@@ -56642,7 +56810,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 129.4742 Td
+63.24 693.7232 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -56653,7 +56821,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 109.885 Td
+63.24 674.134 Td
 /F1.0 10.5 Tf
 <496d706c656d656e746174696f6e206f662074686520737461747573207075626c69636174696f6e20776974682061206d756c746963617374206d6573736167652e> Tj
 ET
@@ -56664,7 +56832,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 82.7032 Td
+63.24 646.9522 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -56675,89 +56843,18 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 65.298 Td
+63.24 629.547 Td
 /F4.0 10.5 Tf
 <6f72672e6170616368652e6861646f6f702e68626173652e6d61737465722e436c75737465725374617475735075626c6973686572244d756c7469636173745075626c6973686572> Tj
 ET
 
 0.0 0.0 0.0 SCN
 0.0 0.0 0.0 scn
-q
-0.0 0.0 0.0 scn
-0.0 0.0 0.0 SCN
-1 w
-0 J
-0 j
-[] 0 d
-/Stamp2 Do
-0.2 0.2 0.2 scn
-0.2 0.2 0.2 SCN
-
-BT
-49.24 14.388 Td
-/F1.0 9 Tf
-<3632> Tj
-ET
-
-0.0 0.0 0.0 SCN
-0.0 0.0 0.0 scn
-Q
-Q
-
-endstream
-endobj
-450 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 595.28 841.89]
-/CropBox [0 0 595.28 841.89]
-/BleedBox [0 0 595.28 841.89]
-/TrimBox [0 0 595.28 841.89]
-/ArtBox [0 0 595.28 841.89]
-/Contents 449 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F4.0 37 0 R
-/F3.0 35 0 R
-/F1.0 10 0 R
->>
-/XObject << /Stamp2 5007 0 R
->>
->>
->>
-endobj
-451 0 obj
-[450 0 R /XYZ 0 805.89 null]
-endobj
-452 0 obj
-[450 0 R /XYZ 0 701.128 null]
-endobj
-453 0 obj
-[450 0 R /XYZ 0 580.586 null]
-endobj
-454 0 obj
-[450 0 R /XYZ 0 428.484 null]
-endobj
-455 0 obj
-[450 0 R /XYZ 0 292.162 null]
-endobj
-456 0 obj
-[450 0 R /XYZ 0 155.84 null]
-endobj
-457 0 obj
-[450 0 R /XYZ 0 51.078 null]
-endobj
-458 0 obj
-<< /Length 7830
->>
-stream
-q
-/DeviceRGB cs
 0.6941 0.1294 0.2745 scn
-/DeviceRGB CS
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 796.11 Td
+48.24 605.547 Td
 /F4.0 10.5 Tf
 <68626173652e7374617475732e6c697374656e65722e636c617373> Tj
 ET
@@ -56768,7 +56865,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 779.5242 Td
+63.24 588.9612 Td
 /F3.0 9.975 Tf
 <4465736372697074696f6e> Tj
 ET
@@ -56779,7 +56876,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 759.935 Td
+63.24 569.372 Td
 /F1.0 10.5 Tf
 <496d706c656d656e746174696f6e206f662074686520737461747573206c697374656e657220776974682061206d756c746963617374206d6573736167652e> Tj
 ET
@@ -56790,7 +56887,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 732.7532 Td
+63.24 542.1902 Td
 /F3.0 9.975 Tf
 <44656661756c74> Tj
 ET
@@ -56801,7 +56898,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-63.24 715.348 Td
+63.24 524.785 Td
 /F4.0 10.5 Tf
 <6f72672e6170616368652e6861646f6f702e68626173652e636c69656e742e436c75737465725374617475734c697374656e6572244d756c7469636173744c697374656e6572> Tj
 ET
@@ -56812,7 +56909,7 @@ ET
 0.6941 0.1294 0.2745 SCN
 
 BT
-48.24 691.348 Td
+48.24 500.785 Td
 /F4.0 10.5 Tf
 <68626173652e7374617475732e6d756c7469636173742e616464726573732e6970> Tj
 ET
@@ -56823,7 +56920,7 @@ ET
 0.2 0.2 0.2 SCN
 
 BT
-63.24 674.7622 Td
+63.24 484.1992 Td
 /F3.0 9.975 Tf
 <44657363

<TRUNCATED>

[37/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
index d2de64a..4ebdb3f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html
@@ -27,309 +27,338 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import java.io.FileNotFoundException;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.util.HashSet;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.util.List;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.util.Set;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.util.concurrent.CancellationException;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.concurrent.locks.ReentrantLock;<a name="line.26"></a>
-<span class="sourceLineNo">027</span><a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.conf.Configuration;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.fs.FileSystem;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.fs.Path;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.ServerName;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TableName;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.errorhandling.ForeignException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.errorhandling.ForeignExceptionSnare;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.executor.EventHandler;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.executor.EventType;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.master.MetricsSnapshot;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.SnapshotSentinel;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.locking.LockManager;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.LockType;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.snapshot.SnapshotCreationException;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifest;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.zookeeper.KeeperException;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>/**<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * A handler for taking snapshots from the master.<a name="line.62"></a>
-<span class="sourceLineNo">063</span> *<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * This is not a subclass of TableEventHandler because using that would incur an extra hbase:meta scan.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> *<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * The {@link #snapshotRegions(List)} call should get implemented for each snapshot flavor.<a name="line.66"></a>
-<span class="sourceLineNo">067</span> */<a name="line.67"></a>
-<span class="sourceLineNo">068</span>@InterfaceAudience.Private<a name="line.68"></a>
-<span class="sourceLineNo">069</span>public abstract class TakeSnapshotHandler extends EventHandler implements SnapshotSentinel,<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    ForeignExceptionSnare {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(TakeSnapshotHandler.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private volatile boolean finished;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // none of these should ever be null<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  protected final MasterServices master;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  protected final MetricsSnapshot metricsSnapshot = new MetricsSnapshot();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  protected final SnapshotDescription snapshot;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  protected final Configuration conf;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  protected final FileSystem fs;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  protected final Path rootDir;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private final Path snapshotDir;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  protected final Path workingDir;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private final MasterSnapshotVerifier verifier;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  protected final ForeignExceptionDispatcher monitor;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  protected final LockManager.MasterLock tableLock;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  protected final MonitoredTask status;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  protected final TableName snapshotTable;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  protected final SnapshotManifest snapshotManifest;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  protected final SnapshotManager snapshotManager;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  protected TableDescriptor htd;<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>   * @param snapshot descriptor of the snapshot to take<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * @param masterServices master services provider<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public TakeSnapshotHandler(SnapshotDescription snapshot, final MasterServices masterServices,<a name="line.98"></a>
-<span class="sourceLineNo">099</span>                             final SnapshotManager snapshotManager) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    super(masterServices, EventType.C_M_SNAPSHOT_TABLE);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    assert snapshot != null : "SnapshotDescription must not be nul1";<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    assert masterServices != null : "MasterServices must not be nul1";<a name="line.102"></a>
-<span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this.master = masterServices;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    this.snapshot = snapshot;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    this.snapshotManager = snapshotManager;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    this.snapshotTable = TableName.valueOf(snapshot.getTable());<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    this.conf = this.master.getConfiguration();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    this.fs = this.master.getMasterFileSystem().getFileSystem();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    this.rootDir = this.master.getMasterFileSystem().getRootDir();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    this.snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, rootDir);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    this.workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    this.monitor = new ForeignExceptionDispatcher(snapshot.getName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    this.snapshotManifest = SnapshotManifest.create(conf, fs, workingDir, snapshot, monitor);<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>    this.tableLock = master.getLockManager().createMasterLock(<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        snapshotTable, LockType.EXCLUSIVE,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.getClass().getName() + ": take snapshot " + snapshot.getName());<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // prepare the verify<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    this.verifier = new MasterSnapshotVerifier(masterServices, snapshot, rootDir);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    // update the running tasks<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    this.status = TaskMonitor.get().createStatus(<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      "Taking " + snapshot.getType() + " snapshot on table: " + snapshotTable);<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>  private TableDescriptor loadTableDescriptor()<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      throws FileNotFoundException, IOException {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    TableDescriptor htd =<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this.master.getTableDescriptors().get(snapshotTable);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    if (htd == null) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      throw new IOException("TableDescriptor missing for " + snapshotTable);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    return htd;<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>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public TakeSnapshotHandler prepare() throws Exception {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    super.prepare();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    // after this, you should ensure to release this lock in case of exceptions<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    this.tableLock.acquire();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    try {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      this.htd = loadTableDescriptor(); // check that .tableinfo is present<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    } catch (Exception e) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      this.tableLock.release();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      throw e;<a name="line.146"></a>
+<span class="sourceLineNo">022</span>import java.net.URI;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.HashSet;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.List;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.Set;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.concurrent.CancellationException;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.concurrent.locks.ReentrantLock;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.conf.Configuration;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.fs.FileSystem;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileUtil;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.Path;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.ServerName;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.TableName;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.errorhandling.ForeignException;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.errorhandling.ForeignExceptionSnare;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.executor.EventHandler;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.executor.EventType;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.master.MetricsSnapshot;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.master.SnapshotSentinel;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.master.locking.LockManager;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.LockType;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.snapshot.SnapshotCreationException;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifest;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.zookeeper.MetaTableLocator;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.zookeeper.KeeperException;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.slf4j.Logger;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.LoggerFactory;<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * A handler for taking snapshots from the master.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> *<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * This is not a subclass of TableEventHandler because using that would incur an extra hbase:meta scan.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> *<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * The {@link #snapshotRegions(List)} call should get implemented for each snapshot flavor.<a name="line.70"></a>
+<span class="sourceLineNo">071</span> */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>@InterfaceAudience.Private<a name="line.72"></a>
+<span class="sourceLineNo">073</span>public abstract class TakeSnapshotHandler extends EventHandler implements SnapshotSentinel,<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    ForeignExceptionSnare {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private static final Logger LOG = LoggerFactory.getLogger(TakeSnapshotHandler.class);<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private volatile boolean finished;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  // none of these should ever be null<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  protected final MasterServices master;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  protected final MetricsSnapshot metricsSnapshot = new MetricsSnapshot();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  protected final SnapshotDescription snapshot;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  protected final Configuration conf;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  protected final FileSystem rootFs;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  protected final FileSystem workingDirFs;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  protected final Path rootDir;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private final Path snapshotDir;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  protected final Path workingDir;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private final MasterSnapshotVerifier verifier;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  protected final ForeignExceptionDispatcher monitor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  protected final LockManager.MasterLock tableLock;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  protected final MonitoredTask status;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  protected final TableName snapshotTable;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  protected final SnapshotManifest snapshotManifest;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  protected final SnapshotManager snapshotManager;<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  protected TableDescriptor htd;<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>   * @param snapshot descriptor of the snapshot to take<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param masterServices master services provider<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @throws IllegalArgumentException if the working snapshot directory set from the<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   *   configuration is the same as the completed snapshot directory<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * @throws IOException if the file system of the working snapshot directory cannot be<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   *   determined<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   */<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public TakeSnapshotHandler(SnapshotDescription snapshot, final MasterServices masterServices,<a name="line.107"></a>
+<span class="sourceLineNo">108</span>                             final SnapshotManager snapshotManager) throws IOException {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    super(masterServices, EventType.C_M_SNAPSHOT_TABLE);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    assert snapshot != null : "SnapshotDescription must not be nul1";<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    assert masterServices != null : "MasterServices must not be nul1";<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    this.master = masterServices;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    this.conf = this.master.getConfiguration();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.rootDir = this.master.getMasterFileSystem().getRootDir();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    this.workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir, conf);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    Preconditions.checkArgument(!SnapshotDescriptionUtils.isSubDirectoryOf(workingDir, rootDir) ||<a name="line.116"></a>
+<span class="sourceLineNo">117</span>            SnapshotDescriptionUtils.isWithinDefaultWorkingDir(workingDir, conf),<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        "The working directory " + workingDir + " cannot be in the root directory unless it is "<a name="line.118"></a>
+<span class="sourceLineNo">119</span>            + "within the default working directory");<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>    this.snapshot = snapshot;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    this.snapshotManager = snapshotManager;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    this.snapshotTable = TableName.valueOf(snapshot.getTable());<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.rootFs = this.master.getMasterFileSystem().getFileSystem();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, rootDir);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    this.workingDirFs = this.workingDir.getFileSystem(this.conf);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.monitor = new ForeignExceptionDispatcher(snapshot.getName());<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    this.snapshotManifest = SnapshotManifest.create(conf, rootFs, workingDir, snapshot, monitor);<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>    this.tableLock = master.getLockManager().createMasterLock(<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        snapshotTable, LockType.EXCLUSIVE,<a name="line.131"></a>
+<span class="sourceLineNo">132</span>        this.getClass().getName() + ": take snapshot " + snapshot.getName());<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // prepare the verify<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    this.verifier = new MasterSnapshotVerifier(masterServices, snapshot, workingDirFs);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // update the running tasks<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    this.status = TaskMonitor.get().createStatus(<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      "Taking " + snapshot.getType() + " snapshot on table: " + snapshotTable);<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>  private TableDescriptor loadTableDescriptor()<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      throws FileNotFoundException, IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    TableDescriptor htd =<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      this.master.getTableDescriptors().get(snapshotTable);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    if (htd == null) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      throw new IOException("TableDescriptor missing for " + snapshotTable);<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    return this;<a name="line.148"></a>
+<span class="sourceLineNo">148</span>    return htd;<a name="line.148"></a>
 <span class="sourceLineNo">149</span>  }<a name="line.149"></a>
 <span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * Execute the core common portions of taking a snapshot. The {@link #snapshotRegions(List)}<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * call should get implemented for each snapshot flavor.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  @Override<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="REC_CATCH_EXCEPTION",<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    justification="Intentional")<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public void process() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    String msg = "Running " + snapshot.getType() + " table snapshot " + snapshot.getName() + " "<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        + eventType + " on table " + snapshotTable;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    LOG.info(msg);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    ReentrantLock lock = snapshotManager.getLocks().acquireLock(snapshot.getName());<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    status.setStatus(msg);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    try {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // If regions move after this meta scan, the region specific snapshot should fail, triggering<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      // an external exception that gets captured here.<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>      // write down the snapshot info in the working directory<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshot, workingDir, fs);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      snapshotManifest.addTableDescriptor(this.htd);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      monitor.rethrowException();<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; regionsAndLocations;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      if (TableName.META_TABLE_NAME.equals(snapshotTable)) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        regionsAndLocations = new MetaTableLocator().getMetaRegionsAndLocations(<a name="line.175"></a>
-<span class="sourceLineNo">176</span>          server.getZooKeeper());<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      } else {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        regionsAndLocations = MetaTableAccessor.getTableRegionsAndLocations(<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          server.getConnection(), snapshotTable, false);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      }<a name="line.180"></a>
+<span class="sourceLineNo">151</span>  @Override<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public TakeSnapshotHandler prepare() throws Exception {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    super.prepare();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    // after this, you should ensure to release this lock in case of exceptions<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    this.tableLock.acquire();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    try {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      this.htd = loadTableDescriptor(); // check that .tableinfo is present<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    } catch (Exception e) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      this.tableLock.release();<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      throw e;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    return this;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  /**<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * Execute the core common portions of taking a snapshot. The {@link #snapshotRegions(List)}<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * call should get implemented for each snapshot flavor.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  @Override<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="REC_CATCH_EXCEPTION",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    justification="Intentional")<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  public void process() {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    String msg = "Running " + snapshot.getType() + " table snapshot " + snapshot.getName() + " "<a name="line.173"></a>
+<span class="sourceLineNo">174</span>        + eventType + " on table " + snapshotTable;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    LOG.info(msg);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    ReentrantLock lock = snapshotManager.getLocks().acquireLock(snapshot.getName());<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    status.setStatus(msg);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      // If regions move after this meta scan, the region specific snapshot should fail, triggering<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      // an external exception that gets captured here.<a name="line.180"></a>
 <span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // run the snapshot<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      snapshotRegions(regionsAndLocations);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      monitor.rethrowException();<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>      // extract each pair to separate lists<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      Set&lt;String&gt; serverNames = new HashSet&lt;&gt;();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      for (Pair&lt;RegionInfo, ServerName&gt; p : regionsAndLocations) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        if (p != null &amp;&amp; p.getFirst() != null &amp;&amp; p.getSecond() != null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          RegionInfo hri = p.getFirst();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>          if (hri.isOffline() &amp;&amp; (hri.isSplit() || hri.isSplitParent())) continue;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>          serverNames.add(p.getSecond().toString());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        }<a name="line.193"></a>
+<span class="sourceLineNo">182</span>      // write down the snapshot info in the working directory<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshot, workingDir, workingDirFs);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      snapshotManifest.addTableDescriptor(this.htd);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      monitor.rethrowException();<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>      List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; regionsAndLocations;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      if (TableName.META_TABLE_NAME.equals(snapshotTable)) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        regionsAndLocations = new MetaTableLocator().getMetaRegionsAndLocations(<a name="line.189"></a>
+<span class="sourceLineNo">190</span>          server.getZooKeeper());<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      } else {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>        regionsAndLocations = MetaTableAccessor.getTableRegionsAndLocations(<a name="line.192"></a>
+<span class="sourceLineNo">193</span>          server.getConnection(), snapshotTable, false);<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>      // flush the in-memory state, and write the single manifest<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      status.setStatus("Consolidate snapshot: " + snapshot.getName());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      snapshotManifest.consolidate();<a name="line.198"></a>
+<span class="sourceLineNo">196</span>      // run the snapshot<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      snapshotRegions(regionsAndLocations);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      monitor.rethrowException();<a name="line.198"></a>
 <span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>      // verify the snapshot is valid<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      status.setStatus("Verifying snapshot: " + snapshot.getName());<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      verifier.verifySnapshot(this.workingDir, serverNames);<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // complete the snapshot, atomically moving from tmp to .snapshot dir.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      completeSnapshot(this.snapshotDir, this.workingDir, this.fs);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      msg = "Snapshot " + snapshot.getName() + " of table " + snapshotTable + " completed";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      status.markComplete(msg);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      LOG.info(msg);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      metricsSnapshot.addSnapshot(status.getCompletionTimestamp() - status.getStartTime());<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    } catch (Exception e) { // FindBugs: REC_CATCH_EXCEPTION<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      status.abort("Failed to complete snapshot " + snapshot.getName() + " on table " +<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          snapshotTable + " because " + e.getMessage());<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      String reason = "Failed taking snapshot " + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          + " due to exception:" + e.getMessage();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      LOG.error(reason, e);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      ForeignException ee = new ForeignException(reason, e);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      monitor.receive(ee);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      // need to mark this completed to close off and allow cleanup to happen.<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      cancel(reason);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    } finally {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      LOG.debug("Launching cleanup of working dir:" + workingDir);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      try {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        // if the working dir is still present, the snapshot has failed.  it is present we delete<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        // it.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        if (fs.exists(workingDir) &amp;&amp; !this.fs.delete(workingDir, true)) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>          LOG.error("Couldn't delete snapshot working directory:" + workingDir);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      } catch (IOException e) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        LOG.error("Couldn't delete snapshot working directory:" + workingDir);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      lock.unlock();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      tableLock.release();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Reset the manager to allow another snapshot to proceed<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   *<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * @param snapshotDir final path of the snapshot<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * @param workingDir directory where the in progress snapshot was built<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * @param fs {@link FileSystem} where the snapshot was built<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * @throws SnapshotCreationException if the snapshot could not be moved<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * @throws IOException the filesystem could not be reached<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public void completeSnapshot(Path snapshotDir, Path workingDir, FileSystem fs)<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      throws SnapshotCreationException, IOException {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    LOG.debug("Sentinel is done, just moving the snapshot from " + workingDir + " to "<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        + snapshotDir);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    if (!fs.rename(workingDir, snapshotDir)) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      throw new SnapshotCreationException("Failed to move working directory(" + workingDir<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          + ") to completed directory(" + snapshotDir + ").");<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    finished = true;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * Snapshot the specified regions<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  protected abstract void snapshotRegions(List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; regions)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      throws IOException, KeeperException;<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * Take a snapshot of the specified disabled region<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  protected void snapshotDisabledRegion(final RegionInfo regionInfo)<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      throws IOException {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    snapshotManifest.addRegion(FSUtils.getTableDir(rootDir, snapshotTable), regionInfo);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    monitor.rethrowException();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    status.setStatus("Completed referencing HFiles for offline region " + regionInfo.toString() +<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        " of table: " + snapshotTable);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public void cancel(String why) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (finished) return;<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>    this.finished = true;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    LOG.info("Stop taking snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot) +<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        " because: " + why);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    CancellationException ce = new CancellationException(why);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    monitor.receive(new ForeignException(master.getServerName().toString(), ce));<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  }<a name="line.282"></a>
-<span class="sourceLineNo">283</span><a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @Override<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  public boolean isFinished() {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    return finished;<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>  @Override<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public long getCompletionTimestamp() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    return this.status.getCompletionTimestamp();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
-<span class="sourceLineNo">293</span><a name="line.293"></a>
-<span class="sourceLineNo">294</span>  @Override<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  public SnapshotDescription getSnapshot() {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return snapshot;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  @Override<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  public ForeignException getExceptionIfFailed() {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    return monitor.getException();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>  @Override<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public void rethrowExceptionIfFailed() throws ForeignException {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    monitor.rethrowException();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public void rethrowException() throws ForeignException {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    monitor.rethrowException();<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>  @Override<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public boolean hasException() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    return monitor.hasException();<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>  @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public ForeignException getException() {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    return monitor.getException();<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>}<a name="line.324"></a>
+<span class="sourceLineNo">200</span>      // extract each pair to separate lists<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      Set&lt;String&gt; serverNames = new HashSet&lt;&gt;();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      for (Pair&lt;RegionInfo, ServerName&gt; p : regionsAndLocations) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        if (p != null &amp;&amp; p.getFirst() != null &amp;&amp; p.getSecond() != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          RegionInfo hri = p.getFirst();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          if (hri.isOffline() &amp;&amp; (hri.isSplit() || hri.isSplitParent())) continue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          serverNames.add(p.getSecond().toString());<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>      // flush the in-memory state, and write the single manifest<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      status.setStatus("Consolidate snapshot: " + snapshot.getName());<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      snapshotManifest.consolidate();<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>      // verify the snapshot is valid<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      status.setStatus("Verifying snapshot: " + snapshot.getName());<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      verifier.verifySnapshot(this.workingDir, serverNames);<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>      // complete the snapshot, atomically moving from tmp to .snapshot dir.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      completeSnapshot(this.snapshotDir, this.workingDir, this.rootFs, this.workingDirFs);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      msg = "Snapshot " + snapshot.getName() + " of table " + snapshotTable + " completed";<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      status.markComplete(msg);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      LOG.info(msg);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      metricsSnapshot.addSnapshot(status.getCompletionTimestamp() - status.getStartTime());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) { // FindBugs: REC_CATCH_EXCEPTION<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      status.abort("Failed to complete snapshot " + snapshot.getName() + " on table " +<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          snapshotTable + " because " + e.getMessage());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      String reason = "Failed taking snapshot " + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          + " due to exception:" + e.getMessage();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      LOG.error(reason, e);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      ForeignException ee = new ForeignException(reason, e);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      monitor.receive(ee);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      // need to mark this completed to close off and allow cleanup to happen.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      cancel(reason);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    } finally {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      LOG.debug("Launching cleanup of working dir:" + workingDir);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      try {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        // if the working dir is still present, the snapshot has failed.  it is present we delete<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        // it.<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        if (!workingDirFs.delete(workingDir, true)) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>          LOG.error("Couldn't delete snapshot working directory:" + workingDir);<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        }<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        LOG.error("Couldn't delete snapshot working directory:" + workingDir);<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      lock.unlock();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      tableLock.release();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Reset the manager to allow another snapshot to proceed.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Commits the snapshot process by moving the working snapshot<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * to the finalized filepath<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   *<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * @param snapshotDir The file path of the completed snapshots<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @param workingDir  The file path of the in progress snapshots<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @param fs The file system of the completed snapshots<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param workingDirFs The file system of the in progress snapshots<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   *<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * @throws SnapshotCreationException if the snapshot could not be moved<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * @throws IOException the filesystem could not be reached<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  public void completeSnapshot(Path snapshotDir, Path workingDir, FileSystem fs,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      FileSystem workingDirFs) throws SnapshotCreationException, IOException {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    LOG.debug("Sentinel is done, just moving the snapshot from " + workingDir + " to "<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        + snapshotDir);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    // If the working and completed snapshot directory are on the same file system, attempt<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    // to rename the working snapshot directory to the completed location. If that fails,<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    // or the file systems differ, attempt to copy the directory over, throwing an exception<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // if this fails<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    URI workingURI = workingDirFs.getUri();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    URI rootURI = fs.getUri();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    if ((!workingURI.getScheme().equals(rootURI.getScheme()) ||<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        !workingURI.getAuthority().equals(rootURI.getAuthority()) ||<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        workingURI.getUserInfo() == null ||<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        !workingURI.getUserInfo().equals(rootURI.getUserInfo()) ||<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        !fs.rename(workingDir, snapshotDir)) &amp;&amp; !FileUtil.copy(workingDirFs, workingDir, fs,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        snapshotDir, true, true, this.conf)) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      throw new SnapshotCreationException("Failed to copy working directory(" + workingDir<a name="line.279"></a>
+<span class="sourceLineNo">280</span>          + ") to completed directory(" + snapshotDir + ").");<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    finished = true;<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>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Snapshot the specified regions<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   */<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  protected abstract void snapshotRegions(List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; regions)<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      throws IOException, KeeperException;<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  /**<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * Take a snapshot of the specified disabled region<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   */<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  protected void snapshotDisabledRegion(final RegionInfo regionInfo)<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      throws IOException {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    snapshotManifest.addRegion(FSUtils.getTableDir(rootDir, snapshotTable), regionInfo);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    monitor.rethrowException();<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    status.setStatus("Completed referencing HFiles for offline region " + regionInfo.toString() +<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        " of table: " + snapshotTable);<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>  @Override<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public void cancel(String why) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    if (finished) return;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    this.finished = true;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    LOG.info("Stop taking snapshot=" + ClientSnapshotDescriptionUtils.toString(snapshot) +<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        " because: " + why);<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    CancellationException ce = new CancellationException(why);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    monitor.receive(new ForeignException(master.getServerName().toString(), ce));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  @Override<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public boolean isFinished() {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    return finished;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public long getCompletionTimestamp() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return this.status.getCompletionTimestamp();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
+<span class="sourceLineNo">322</span><a name="line.322"></a>
+<span class="sourceLineNo">323</span>  @Override<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  public SnapshotDescription getSnapshot() {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    return snapshot;<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>  @Override<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  public ForeignException getExceptionIfFailed() {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    return monitor.getException();<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
+<span class="sourceLineNo">332</span><a name="line.332"></a>
+<span class="sourceLineNo">333</span>  @Override<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  public void rethrowExceptionIfFailed() throws ForeignException {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    monitor.rethrowException();<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>  @Override<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  public void rethrowException() throws ForeignException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    monitor.rethrowException();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  @Override<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public boolean hasException() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return monitor.hasException();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  @Override<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public ForeignException getException() {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    return monitor.getException();<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>
 
 
 


[12/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.CheckAndPutThread.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="line.589"></a>
-<span class="sourceLineNo">590<

<TRUNCATED>

[29/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Options.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Options.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Options.html
index 7d49582..01861a7 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Options.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Options.html
@@ -980,175 +980,177 @@
 <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><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, inputRoot);<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    Path snapshotTmpDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(targetName, outputRoot);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    Path outputSnapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    Path initialOutputSnapshotDir = skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>    // Find the necessary directory which need to change owner and group<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    Path needSetOwnerDir = SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    if (outputFs.exists(needSetOwnerDir)) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>      if (skipTmp) {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        needSetOwnerDir = outputSnapshotDir;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>      } else {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        needSetOwnerDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        if (outputFs.exists(needSetOwnerDir)) {<a name="line.989"></a>
-<span class="sourceLineNo">990</span>          needSetOwnerDir = snapshotTmpDir;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        }<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    // Check if the snapshot already exists<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    if (outputFs.exists(outputSnapshotDir)) {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      if (overwrite) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>        if (!outputFs.delete(outputSnapshotDir, true)) {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>          System.err.println("Unable to remove existing snapshot directory: " + outputSnapshotDir);<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>          return 1;<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>      } else {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>        System.err.println("The snapshot '" + targetName +<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>          "' already exists in the destination: " + outputSnapshotDir);<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>        return 1;<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span><a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (!skipTmp) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      // Check if the snapshot already in-progress<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      if (outputFs.exists(snapshotTmpDir)) {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>        if (overwrite) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>          if (!outputFs.delete(snapshotTmpDir, true)) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>            System.err.println("Unable to remove existing snapshot tmp directory: "+snapshotTmpDir);<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>            return 1;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          }<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        } else {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          System.err.println("A snapshot with the same name '"+ targetName +"' may be in-progress");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          System.err.println("Please check "+snapshotTmpDir+". If the snapshot has completed, ");<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          System.err.println("consider removing "+snapshotTmpDir+" by using the -overwrite option");<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          return 1;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      }<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>    // Step 1 - Copy fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    // The snapshot references must be copied before the hfiles otherwise the cleaner<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    // will remove them because they are unreferenced.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    List&lt;Path&gt; travesedPaths = new ArrayList&lt;&gt;();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    boolean copySucceeded = false;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    try {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      LOG.info("Copy Snapshot Manifest from " + snapshotDir + " to " + initialOutputSnapshotDir);<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      travesedPaths =<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>          FSUtils.copyFilesParallel(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, conf,<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>              conf.getInt(CONF_COPY_MANIFEST_THREADS, DEFAULT_COPY_MANIFEST_THREADS));<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      copySucceeded = true;<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (IOException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>        snapshotDir + " to=" + initialOutputSnapshotDir, e);<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } finally {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      if (copySucceeded) {<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>        if (filesUser != null || filesGroup != null) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>          LOG.warn((filesUser == null ? "" : "Change the owner of " + needSetOwnerDir + " to "<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>              + filesUser)<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>              + (filesGroup == null ? "" : ", Change the group of " + needSetOwnerDir + " to "<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>                  + filesGroup));<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>          setOwnerParallel(outputFs, filesUser, filesGroup, conf, travesedPaths);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        if (filesMode &gt; 0) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          LOG.warn("Change the permission of " + needSetOwnerDir + " to " + filesMode);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          setPermissionParallel(outputFs, (short)filesMode, travesedPaths, conf);<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        }<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    // Write a new .snapshotinfo if the target name is different from the source name<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    if (!targetName.equals(snapshotName)) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      SnapshotDescription snapshotDesc =<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>        SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>          .toBuilder()<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>          .setName(targetName)<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>          .build();<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>      SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, initialOutputSnapshotDir, outputFs);<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      if (filesUser != null || filesGroup != null) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        outputFs.setOwner(new Path(initialOutputSnapshotDir,<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), filesUser, filesGroup);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      }<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      if (filesMode &gt; 0) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>        outputFs.setPermission(new Path(initialOutputSnapshotDir,<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>          SnapshotDescriptionUtils.SNAPSHOTINFO_FILE), new FsPermission((short)filesMode));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    }<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // Step 2 - Start MR Job to copy files<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    // The snapshot references must be copied before the files otherwise the files gets removed<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    // by the HFileArchiver, since they have no references.<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    try {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      runCopyJob(inputRoot, outputRoot, snapshotName, snapshotDir, verifyChecksum,<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>                 filesUser, filesGroup, filesMode, mappers, bandwidthMB);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      LOG.info("Finalize the Snapshot Export");<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (!skipTmp) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        // Step 3 - Rename fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        if (!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          throw new ExportSnapshotException("Unable to rename snapshot directory from=" +<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            snapshotTmpDir + " to=" + outputSnapshotDir);<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>        }<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span><a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>      // Step 4 - Verify snapshot integrity<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      if (verifyTarget) {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        LOG.info("Verify snapshot integrity");<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        verifySnapshot(destConf, outputFs, outputRoot, outputSnapshotDir);<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      }<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      LOG.info("Export Completed: " + targetName);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      return 0;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (Exception e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.error("Snapshot export failed", e);<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>      if (!skipTmp) {<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        outputFs.delete(snapshotTmpDir, true);<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      }<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      outputFs.delete(outputSnapshotDir, true);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      return 1;<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      IOUtils.closeStream(inputFs);<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      IOUtils.closeStream(outputFs);<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  @Override<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  protected void printUsage() {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    super.printUsage();<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    System.out.println("\n"<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>        + "Examples:\n"<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>        + "  hbase snapshot export \\\n"<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>        + "    --snapshot MySnapshot --copy-to hdfs://srv2:8082/hbase \\\n"<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>        + "    --chuser MyUser --chgroup MyGroup --chmod 700 --mappers 16\n"<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        + "\n"<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        + "  hbase snapshot export \\\n"<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        + "    --snapshot MySnapshot --copy-from hdfs://srv2:8082/hbase \\\n"<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>        + "    --copy-to hdfs://srv1:50070/hbase");<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>  }<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span><a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>  @Override protected void addOptions() {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    addRequiredOption(Options.SNAPSHOT);<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>    addOption(Options.COPY_TO);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>    addOption(Options.COPY_FROM);<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    addOption(Options.TARGET_NAME);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>    addOption(Options.NO_CHECKSUM_VERIFY);<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    addOption(Options.NO_TARGET_VERIFY);<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    addOption(Options.OVERWRITE);<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    addOption(Options.CHUSER);<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    addOption(Options.CHGROUP);<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    addOption(Options.CHMOD);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    addOption(Options.MAPPERS);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    addOption(Options.BANDWIDTH);<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>  }<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span><a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>  public static void main(String[] args) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    new ExportSnapshot().doStaticMain(args);<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>  }<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>}<a name="line.1143"></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>
 
 
 


[34/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
index df746ae..d27bef3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
@@ -208,1157 +208,1163 @@
 <span class="sourceLineNo">200</span>      throws IOException {<a name="line.200"></a>
 <span class="sourceLineNo">201</span>    this(conf,<a name="line.201"></a>
 <span class="sourceLineNo">202</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        new Path(CommonFSUtils.getRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME), leaseRecovery);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  @VisibleForTesting<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.conf = conf;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    this.leaseRecovery = leaseRecovery;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.walDir = walDir;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    this.walArchiveDir = walArchiveDir;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.fs = walDir.getFileSystem(conf);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    // Create the log directory for the procedure store<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (!fs.exists(walDir)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      if (!fs.mkdirs(walDir)) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // Now that it exists, set the log policy<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    String storagePolicy =<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (LOG.isDebugEnabled()) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          LOG.debug("Created Procedure Store WAL archive dir " + this.walArchiveDir);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        LOG.warn("Failed create of " + this.walArchiveDir);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @Override<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public void start(int numSlots) throws IOException {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    if (!setRunning(true)) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      return;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>    // Init buffer slots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    loading.set(true);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    runningProcCount = numSlots;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    syncMaxSlot = numSlots;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    slots = new ByteSlot[numSlots];<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    slotsCache = new LinkedTransferQueue();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      slotsCache.offer(new ByteSlot());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Tunings<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    walCountWarnThreshold =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    maxRetriesBeforeRoll =<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    // WebUI<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    syncMetricsQueue = new CircularFifoQueue(<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    // Init sync thread<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      public void run() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        try {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>          syncLoop();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        } catch (Throwable e) {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>          if (!isSyncAborted()) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>            sendAbortProcessSignal();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          }<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>    };<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    syncThread.start();<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>  @Override<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public void stop(final boolean abort) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    if (!setRunning(false)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      return;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    sendStopSignal();<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (!isSyncAborted()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      try {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        while (syncThread.isAlive()) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          sendStopSignal();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>          syncThread.join(250);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      } catch (InterruptedException e) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        LOG.warn("join interrupted", e);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        Thread.currentThread().interrupt();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    // Close the writer<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    closeCurrentLogStream();<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>    // Close the old logs<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    // they should be already closed, this is just in case the load fails<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    // and we call start() and then stop()<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    for (ProcedureWALFile log: logs) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      log.close();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    logs.clear();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    loading.set(true);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>  private void sendStopSignal() {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    if (lock.tryLock()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      try {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        waitCond.signalAll();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        syncCond.signalAll();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      } finally {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        lock.unlock();<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  @Override<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  public int getNumThreads() {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    return slots == null ? 0 : slots.length;<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>  @Override<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  public int setRunningProcedureCount(final int count) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return this.runningProcCount;<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>  public ProcedureStoreTracker getStoreTracker() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return storeTracker;<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>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    lock.lock();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    try {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      return new ArrayList&lt;&gt;(logs);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    } finally {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      lock.unlock();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<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>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    return corruptedLogs;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  @Override<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  public void recoverLease() throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    lock.lock();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      boolean afterFirstAttempt = false;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      while (isRunning()) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        // Don't sleep before first attempt<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        if (afterFirstAttempt) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.371"></a>
-<span class="sourceLineNo">372</span>              waitBeforeRoll);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        } else {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>          afterFirstAttempt = true;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>        }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        // Get Log-MaxID and recover lease on old logs<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        try {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          flushLogId = initOldLogs(oldLogs);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        } catch (FileNotFoundException e) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          continue;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // Create new state-log<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          // someone else has already created this log<a name="line.388"></a>
-<span class="sourceLineNo">389</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>          continue;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        }<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>        // We have the lease on the log<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        oldLogs = getLogFiles();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          if (LOG.isDebugEnabled()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>            LOG.debug("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        break;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    } finally {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      lock.unlock();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>  @Override<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  public void load(final ProcedureLoader loader) throws IOException {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    lock.lock();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    try {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (logs.isEmpty()) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      // Nothing to do, If we have only the current log.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      if (logs.size() == 1) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        LOG.trace("No state logs to replay.");<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        loader.setMaxProcId(0);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        return;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      // Load the old logs<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      final Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      it.next(); // Skip the current log<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>        @Override<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        public void setMaxProcId(long maxProcId) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          loader.setMaxProcId(maxProcId);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>        @Override<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          loader.load(procIter);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        }<a name="line.440"></a>
-<span class="sourceLineNo">441</span><a name="line.441"></a>
-<span class="sourceLineNo">442</span>        @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>          loader.handleCorrupted(procIter);<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>        @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>          if (corruptedLogs == null) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          }<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          corruptedLogs.add(log);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          // TODO: sideline corrupted log<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      });<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    } finally {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      try {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        // try to cleanup inactive wals and complete the operation<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        buildHoldingCleanupTracker();<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        tryCleanupLogsOnLoad();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        loading.set(false);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      } finally {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        lock.unlock();<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>  private void tryCleanupLogsOnLoad() {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    // nothing to cleanup.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (logs.size() &lt;= 1) return;<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>    // the config says to not cleanup wals on load.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      return;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>    try {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      periodicRoll();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    } catch (IOException e) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>  @Override<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public void insert(final Procedure proc, final Procedure[] subprocs) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    if (LOG.isTraceEnabled()) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      LOG.trace("Insert " + proc + ", subproc=" + Arrays.toString(subprocs));<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>    ByteSlot slot = acquireSlot();<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // Serialize the insert<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      long[] subProcIds = null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (subprocs != null) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        ProcedureWALFormat.writeInsert(slot, proc, subprocs);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        subProcIds = new long[subprocs.length];<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        for (int i = 0; i &lt; subprocs.length; ++i) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>          subProcIds[i] = subprocs[i].getProcId();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      } else {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        assert !proc.hasParent();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        ProcedureWALFormat.writeInsert(slot, proc);<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>      // Push the transaction data and wait until it is persisted<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      pushData(PushType.INSERT, slot, proc.getProcId(), subProcIds);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    } catch (IOException e) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      // We are not able to serialize the procedure.<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      // this is a code error, and we are not able to go on.<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: proc=" +<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          proc + ", subprocs=" + Arrays.toString(subprocs), e);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      throw new RuntimeException(e);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    } finally {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      releaseSlot(slot);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>  }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>  @Override<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  public void insert(final Procedure[] procs) {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    if (LOG.isTraceEnabled()) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      LOG.trace("Insert " + Arrays.toString(procs));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>    ByteSlot slot = acquireSlot();<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    try {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      // Serialize the insert<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      long[] procIds = new long[procs.length];<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      for (int i = 0; i &lt; procs.length; ++i) {<a name="line.530"></a>
-<span class="sourceLineNo">531</span>        assert !procs[i].hasParent();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        procIds[i] = procs[i].getProcId();<a name="line.532"></a>
-<span class="sourceLineNo">533</span>        ProcedureWALFormat.writeInsert(slot, procs[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      pushData(PushType.INSERT, slot, Procedure.NO_PROC_ID, procIds);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    } catch (IOException e) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      // We are not able to serialize the procedure.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // this is a code error, and we are not able to go on.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize one of the procedure: " +<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          Arrays.toString(procs), e);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      throw new RuntimeException(e);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    } finally {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      releaseSlot(slot);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  @Override<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  public void update(final Procedure proc) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    if (LOG.isTraceEnabled()) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      LOG.trace("Update " + proc);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    ByteSlot slot = acquireSlot();<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      // Serialize the update<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      ProcedureWALFormat.writeUpdate(slot, proc);<a name="line.558"></a>
-<span class="sourceLineNo">559</span><a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Push the transaction data and wait until it is persisted<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      pushData(PushType.UPDATE, slot, proc.getProcId(), null);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } catch (IOException e) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      // We are not able to serialize the procedure.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      // this is a code error, and we are not able to go on.<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>      throw new RuntimeException(e);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    } finally {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      releaseSlot(slot);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  @Override<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  public void delete(final long procId) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    if (LOG.isTraceEnabled()) {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      LOG.trace("Delete " + procId);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>    ByteSlot slot = acquireSlot();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      // Serialize the delete<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      ProcedureWALFormat.writeDelete(slot, procId);<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>      // Push the transaction data and wait until it is persisted<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      pushData(PushType.DELETE, slot, procId, null);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } catch (IOException e) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      // We are not able to serialize the procedure.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      // this is a code error, and we are not able to go on.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + procId, e);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      throw new RuntimeException(e);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    } finally {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      releaseSlot(slot);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>  @Override<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  public void delete(final Procedure proc, final long[] subProcIds) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    assert proc != null : "expected a non-null procedure";<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    assert subProcIds != null &amp;&amp; subProcIds.length &gt; 0 : "expected subProcIds";<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    if (LOG.isTraceEnabled()) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      LOG.trace("Update " + proc + " and Delete " + Arrays.toString(subProcIds));<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>    ByteSlot slot = acquireSlot();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    try {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      // Serialize the delete<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      ProcedureWALFormat.writeDelete(slot, proc, subProcIds);<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>      // Push the transaction data and wait until it is persisted<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      pushData(PushType.DELETE, slot, proc.getProcId(), subProcIds);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    } catch (IOException e) {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      // We are not able to serialize the procedure.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      // this is a code error, and we are not able to go on.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      LOG.error(HBaseMarkers.FATAL, "Unable to serialize the procedure: " + proc, e);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      throw new RuntimeException(e);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    } finally {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      releaseSlot(slot);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    }<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>  @Override<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  public void delete(final long[] procIds, final int offset, final int count) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    if (count == 0) return;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if (offset == 0 &amp;&amp; count == procIds.length) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      delete(procIds);<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    } else if (count == 1) {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      delete(procIds[offset]);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    } else {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      delete(Arrays.copyOfRange(procIds, offset, offset + count));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>  private void delete(final long[] procIds) {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    if (LOG.isTraceEnabled()) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      LOG.trace("Delete " + Arrays.toString(procIds));<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    final ByteSlot slot = acquireSlot();<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    try {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      // Serialize the delete<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>        ProcedureWALFormat.writeDelete(slot, procIds[i]);<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>      // Push the transaction data and wait until it is persisted<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      pushData(PushType.DELETE, slot, Procedure.NO_PROC_ID, procIds);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    } catch (IOException e) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      // We are not able to serialize the procedure.<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      // this is a code error, and we are not able to go on.<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      LOG.error("Unable to serialize the procedures: " + Arrays.toString(procIds), e);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      throw new RuntimeException(e);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    } finally {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      releaseSlot(slot);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
-<span class="sourceLineNo">655</span><a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private ByteSlot acquireSlot() {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    ByteSlot slot = slotsCache.poll();<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    return slot != null ? slot : new ByteSlot();<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  private void releaseSlot(final ByteSlot slot) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    slot.reset();<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    slotsCache.offer(slot);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private enum PushType { INSERT, UPDATE, DELETE }<a name="line.666"></a>
-<span class="sourceLineNo">667</span><a name="line.667"></a>
-<span class="sourceLineNo">668</span>  private long pushData(final PushType type, final ByteSlot slot,<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      final long procId, final long[] subProcIds) {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    if (!isRunning()) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      throw new RuntimeException("the store must be running before inserting data");<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    if (logs.isEmpty()) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      throw new RuntimeException("recoverLease() must be called before inserting data");<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    }<a name="line.675"></a>
-<span class="sourceLineNo">676</span><a name="line.676"></a>
-<span class="sourceLineNo">677</span>    long logId = -1;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    lock.lock();<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    try {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      // Wait for the sync to be completed<a name="line.680"></a>
-<span class="sourceLineNo">681</span>      while (true) {<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        if (!isRunning()) {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>          throw new RuntimeException("store no longer running");<a name="line.683"></a>
-<span class="sourceLineNo">684</span>        } else if (isSyncAborted()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>          throw new RuntimeException("sync aborted", syncException.get());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>        } else if (inSync.get()) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>          syncCond.await();<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        } else if (slotIndex &gt;= syncMaxSlot) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>          slotCond.signal();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          syncCond.await();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        } else {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          break;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>        }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      final long pushSyncId = syncId.get();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      updateStoreTracker(type, procId, subProcIds);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>      slots[slotIndex++] = slot;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      logId = flushLogId;<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>      // Notify that there is new data<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      if (slotIndex == 1) {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>        waitCond.signal();<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>      // Notify that the slots are full<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      if (slotIndex == syncMaxSlot) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        waitCond.signal();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>        slotCond.signal();<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      }<a name="line.710"></a>
-<span class="sourceLineNo">711</span><a name="line.711"></a>
-<span class="sourceLineNo">712</span>      while (pushSyncId == syncId.get() &amp;&amp; isRunning()) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>        syncCond.await();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      }<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    } catch (InterruptedException e) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>      Thread.currentThread().interrupt();<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      sendAbortProcessSignal();<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      throw new RuntimeException(e);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    } finally {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      lock.unlock();<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      if (isSyncAborted()) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        throw new RuntimeException("sync aborted", syncException.get());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      }<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    return logId;<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>  private void updateStoreTracker(final PushType type,<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      final long procId, final long[] subProcIds) {<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    switch (type) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      case INSERT:<a name="line.731"></a>
-<span class="sourceLineNo">732</span>        if (subProcIds == null) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>          storeTracker.insert(procId);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        } else if (procId == Procedure.NO_PROC_ID) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>          storeTracker.insert(subProcIds);<a name="line.735"></a>
-<span class="sourceLineNo">736</span>        } else {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>          storeTracker.insert(procId, subProcIds);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>        }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        break;<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      case UPDATE:<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        storeTracker.update(procId);<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        break;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      case DELETE:<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        if (subProcIds != null &amp;&amp; subProcIds.length &gt; 0) {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>          storeTracker.delete(subProcIds);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>          holdingCleanupTracker.setDeletedIfSet(subProcIds);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>        } else {<a name="line.749"></a>
-<span class="sourceLineNo">750</span>          storeTracker.delete(procId);<a name="line.750"></a>
-<span class="sourceLineNo">751</span>          holdingCleanupTracker.setDeletedIfSet(procId);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        break;<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      default:<a name="line.754"></a>
-<span class="sourceLineNo">755</span>        throw new RuntimeException("invalid push type " + type);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    }<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  }<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>  private boolean isSyncAborted() {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    return syncException.get() != null;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>  private void syncLoop() throws Throwable {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    long totalSyncedToStore = 0;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    inSync.set(false);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    lock.lock();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    try {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      while (isRunning()) {<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        try {<a name="line.769"></a>
-<span class="sourceLineNo">770</span>          // Wait until new data is available<a name="line.770"></a>
-<span class="sourceLineNo">771</span>          if (slotIndex == 0) {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>            if (!loading.get()) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>              periodicRoll();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>            }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>            if (LOG.isTraceEnabled()) {<a name="line.776"></a>
-<span class="sourceLineNo">777</span>              float rollTsSec = getMillisFromLastRoll() / 1000.0f;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>              LOG.trace(String.format("Waiting for data. flushed=%s (%s/sec)",<a name="line.778"></a>
-<span class="sourceLineNo">779</span>                        StringUtils.humanSize(totalSynced.get()),<a name="line.779"></a>
-<span class="sourceLineNo">780</span>                        StringUtils.humanSize(totalSynced.get() / rollTsSec)));<a name="line.780"></a>
-<span class="sourceLineNo">781</span>            }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>            waitCond.await(getMillisToNextPeriodicRoll(), TimeUnit.MILLISECONDS);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>            if (slotIndex == 0) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>              // no data.. probably a stop() or a periodic roll<a name="line.785"></a>
-<span class="sourceLineNo">786</span>              continue;<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>          // Wait SYNC_WAIT_MSEC or the signal of "slots full" before flushing<a name="line.789"></a>
-<span class="sourceLineNo">790</span>          syncMaxSlot = runningProcCount;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>          assert syncMaxSlot &gt; 0 : "unexpected syncMaxSlot=" + syncMaxSlot;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>          final long syncWaitSt = System.currentTimeMillis();<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          if (slotIndex != syncMaxSlot) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>            slotCond.await(syncWaitMsec, TimeUnit.MILLISECONDS);<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>          final long currentTs = System.currentTimeMillis();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>          final long syncWaitMs = currentTs - syncWaitSt;<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          final float rollSec = getMillisFromLastRoll() / 1000.0f;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>          final float syncedPerSec = totalSyncedToStore / rollSec;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>          if (LOG.isTraceEnabled() &amp;&amp; (syncWaitMs &gt; 10 || slotIndex &lt; syncMaxSlot)) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>            LOG.trace(String.format("Sync wait %s, slotIndex=%s , totalSynced=%s (%s/sec)",<a name="line.802"></a>
-<span class="sourceLineNo">803</span>                      StringUtils.humanTimeDiff(syncWaitMs), slotIndex,<a name="line.803"></a>
-<span class="sourceLineNo">804</span>                      StringUtils.humanSize(totalSyncedToStore),<a name="line.804"></a>
-<span class="sourceLineNo">805</span>                      StringUtils.humanSize(syncedPerSec)));<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>          // update webui circular buffers (TODO: get rid of allocations)<a name="line.808"></a>
-<span class="sourceLineNo">809</span>          final SyncMetrics syncMetrics = new SyncMetrics();<a name="line.809"></a>
-<span class="sourceLineNo">810</span>          syncMetrics.timestamp = currentTs;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>          syncMetrics.syncWaitMs = syncWaitMs;<a name="line.811"></a>
-<span class="sourceLineNo">812</span>          syncMetrics.syncedEntries = slotIndex;<a name="line.812"></a>
-<span class="sourceLineNo">813</span>          syncMetrics.totalSyncedBytes = totalSyncedToStore;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          syncMetrics.syncedPerSec = syncedPerSec;<a name="line.814"></a>
-<span class="sourceLineNo">815</span>          syncMetricsQueue.add(syncMetrics);<a name="line.815"></a>
-<span class="sourceLineNo">816</span><a name="line.816"></a>
-<span class="sourceLineNo">817</span>          // sync<a name="line.817"></a>
-<span class="sourceLineNo">818</span>          inSync.set(true);<a name="line.818"></a>
-<span class="sourceLineNo">819</span>          long slotSize = syncSlots();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          logs.getLast().addToSize(slotSize);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>          totalSyncedToStore = totalSynced.addAndGet(slotSize);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>          slotIndex = 0;<a name="line.822"></a>
-<span class="sourceLineNo">823</span>          inSync.set(false);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>          syncId.incrementAndGet();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>        } catch (InterruptedException e) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>          Thread.currentThread().interrupt();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>          syncException.compareAndSet(null, e);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>          sendAbortProcessSignal();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>          throw e;<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        } catch (Throwable t) {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          syncException.compareAndSet(null, t);<a name="line.831"></a>
-<span class="sourceLineNo">832</span>          sendAbortProcessSignal();<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          throw t;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        } finally {<a name="line.834"></a>
-<span class="sourceLineNo">835</span>          syncCond.signalAll();<a name="line.835"></a>
-<span class="sourceLineNo">836</span>        }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    } finally {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      lock.unlock();<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>  public ArrayList&lt;SyncMetrics&gt; getSyncMetrics() {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    lock.lock();<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    try {<a name="line.845"></a>
-<span class="sourceLineNo">846</span>      return new ArrayList&lt;&gt;(syncMetricsQueue);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    } finally {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      lock.unlock();<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    }<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
-<span class="sourceLineNo">852</span>  private long syncSlots() throws Throwable {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    int retry = 0;<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    int logRolled = 0;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    long totalSynced = 0;<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    do {<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      try {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>        totalSynced = syncSlots(stream, slots, 0, slotIndex);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        break;<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      } catch (Throwable e) {<a name="line.860"></a>
-<span class="sourceLineNo">861</span>        LOG.warn("unable to sync slots, retry=" + retry);<a name="line.861"></a>
-<span class="sourceLineNo">862</span>        if (++retry &gt;= maxRetriesBeforeRoll) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          if (logRolled &gt;= maxSyncFailureRoll &amp;&amp; isRunning()) {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            LOG.error("Sync slots after log roll failed, abort.", e);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>            throw e;<a name="line.865"></a>
-<span class="sourceLineNo">866</span>          }<a name="line.866"></a>
-<span class="sourceLineNo">867</span><a name="line.867"></a>
-<span class="sourceLineNo">868</span>          if (!rollWriterWithRetries()) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>            throw e;<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>          logRolled++;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>          retry = 0;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>        }<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      }<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    } while (isRunning());<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    return totalSynced;<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>  protected long syncSlots(final FSDataOutputStream stream, final ByteSlot[] slots,<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      final int offset, final int count) throws IOException {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    long totalSynced = 0;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    for (int i = 0; i &lt; count; ++i) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final ByteSlot data = slots[offset + i];<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      data.writeTo(stream);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      totalSynced += data.size();<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span><a name="line.888"></a>
-<span class="sourceLineNo">889</span>    syncStream(stream);<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    sendPostSyncSignal();<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>    if (LOG.isTraceEnabled()) {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      LOG.trace("Sync slots=" + count + '/' + syncMaxSlot +<a name="line.893"></a>
-<span class="sourceLineNo">894</span>                ", flushed=" + StringUtils.humanSize(totalSynced));<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    }<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    return totalSynced;<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>  protected void syncStream(final FSDataOutputStream stream) throws IOException {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (useHsync) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      stream.hsync();<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    } else {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      stream.hflush();<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>  private boolean rollWriterWithRetries() {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    for (int i = 0; i &lt; rollRetries &amp;&amp; isRunning(); ++i) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      if (i &gt; 0) Threads.sleepWithoutInterrupt(waitBeforeRoll * i);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>      try {<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        if (rollWriter()) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>          return true;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>        }<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      } catch (IOException e) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>        LOG.warn("Unable to roll the log, attempt=" + (i + 1), e);<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      }<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    LOG.error(HBaseMarkers.FATAL, "Unable to roll the log");<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    return false;<a name="line.920"></a>
-<span class="sourceLineNo">921</span>  }<a name="line.921"></a>
-<span class="sourceLineNo">922</span><a name="line.922"></a>
-<span class="sourceLineNo">923</span>  private boolean tryRollWriter() {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    try {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      return rollWriter();<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    } catch (IOException e) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      LOG.warn("Unable to roll the log", e);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      return false;<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>  }<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>  public long getMillisToNextPeriodicRoll() {<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    if (lastRollTs.get() &gt; 0 &amp;&amp; periodicRollMsec &gt; 0) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      return periodicRollMsec - getMillisFromLastRoll();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    }<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    return Long.MAX_VALUE;<a name="line.936"></a>
-<span class="sourceLineNo">937</span>  }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>  public long getMillisFromLastRoll() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    return (System.currentTimeMillis() - lastRollTs.get());<a name="line.940"></a>
-<span class="sourceLineNo">941</span>  }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>  @VisibleForTesting<a name="line.943"></a>
-<span class="sourceLineNo">944</span>  protected void periodicRollForTesting() throws IOException {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    lock.lock();<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    try {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      periodicRoll();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    } finally {<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      lock.unlock();<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    }<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  }<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>  @VisibleForTesting<a name="line.953"></a>
-<span class="sourceLineNo">954</span>  protected boolean rollWriterForTesting() throws IOException {<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    lock.lock();<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    try {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      return rollWriter();<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    } finally {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      lock.unlock();<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    }<a name="line.960"></a>
-<span class="sourceLineNo">961</span>  }<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>  @VisibleForTesting<a name="line.963"></a>
-<span class="sourceLineNo">964</span>  protected void removeInactiveLogsForTesting() throws Exception {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    lock.lock();<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    try {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      removeInactiveLogs();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    } finally  {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>      lock.unlock();<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>  private void periodicRoll() throws IOException {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>    if (storeTracker.isEmpty()) {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (LOG.isTraceEnabled()) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        LOG.trace("no active procedures");<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      tryRollWriter();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      removeAllLogs(flushLogId - 1);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    } else {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      if (storeTracker.isUpdated()) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        if (LOG.isTraceEnabled()) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>          LOG.trace("all the active procedures are in the latest log");<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        }<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        removeAllLogs(flushLogId - 1);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span><a name="line.987"></a>
-<span class="sourceLineNo">988</span>      // if the log size has exceeded the roll threshold<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      // or the periodic roll timeout is expired, try to roll the wal.<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      if (totalSynced.get() &gt; rollThreshold || getMillisToNextPeriodicRoll() &lt;= 0) {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>        tryRollWriter();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      }<a name="line.992"></a>
-<span class="sourceLineNo">993</span><a name="line.993"></a>
-<span class="sourceLineNo">994</span>      removeInactiveLogs();<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>  private boolean rollWriter() throws IOException {<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    if (!isRunning()) return false;<a name="line.999"></a>
-<span class="sourceLineNo">1000</span><a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    // Create new state-log<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    if (!rollWriter(flushLogId + 1)) {<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>      LOG.warn("someone else has already created log " + flushLogId);<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      return false;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    }<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span><a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    // We have the lease on the log,<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    // but we should check if someone else has created new files<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    if (getMaxLogId(getLogFiles()) &gt; flushLogId) {<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      LOG.warn("Someone else created new logs. Expected maxLogId &lt; " + flushLogId);<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      logs.getLast().removeFile(this.walArchiveDir);<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      return false;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    }<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    // We have the lease on the log<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    return true;<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>  }<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span><a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>  @VisibleForTesting<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>  boolean rollWriter(final long logId) throws IOException {<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    assert logId &gt; flushLogId : "logId=" + logId + " flushLogId=" + flushLogId;<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    assert lock.isHeldByCurrentThread() : "expected to be the lock owner. " + lock.isLocked();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span><a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    ProcedureWALHeader header = ProcedureWALHeader.newBuilder()<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      .setVersion(ProcedureWALFormat.HEADER_VERSION)<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      .setType(ProcedureWALFormat.LOG_TYPE_STREAM)<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      .setMinProcId(storeTracker.getActiveMinProcId())<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      .setLogId(logId)<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      .build();<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    FSDataOutputStream newStream = null;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    Path newLogFile = null;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    long startPos = -1;<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    newLogFile = getLogFilePath(logId);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>    try {<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>      newStream = CommonFSUtils.createForWal(fs, newLogFile, false);<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    } catch (FileAlreadyExistsException e) {<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>      LOG.error("Log file with id=" + logId + " already exists", e);<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return false;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    } catch (RemoteException re) {<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>      LOG.warn("failed to create log file with id=" + logId, re);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>      return false;<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    }<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    // After we create the stream but before we attempt to use it at all<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    // ensure that we can provide the level of data safety we're configured<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    // to provide.<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>    final String durability = useHsync ? "hsync" : "hflush";<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    if (enforceStreamCapability &amp;&amp; !(CommonFSUtils.hasCapability(newStream, durability))) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        throw new IllegalStateException("The procedure WAL relies on the ability to " + durability +<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>          " for proper operation during component failures, but the underlying filesystem does " +<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>          "not support doing so. Please check the config value of '" + USE_HSYNC_CONF_KEY +<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>          "' to set the desired level of robustness and ensure the config value of '" +<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>          CommonFSUtils.HBASE_WAL_DIR + "' points to a FileSystem mount that can provide it.");<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    try {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      ProcedureWALFormat.writeHeader(newStream, header);<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      startPos = newStream.getPos();<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    } catch (IOException ioe) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      LOG.warn("Encountered exception writing header", ioe);<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      newStream.close();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    closeCurrentLogStream();<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span><a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    storeTracker.resetUpdates();<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    stream = newStream;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>    flushLogId = logId;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>    totalSynced.set(0);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>    long rollTs = System.currentTimeMillis();<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    lastRollTs.set(rollTs);<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>    logs.add(new ProcedureWALFile(fs, newLogFile, header, startPos, rollTs));<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    // if it's the first next WAL being added, build the holding cleanup tracker<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    if (logs.size() == 2) {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      buildHoldingCleanupTracker();<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    } else if (logs.size() &gt; walCountWarnThreshold) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      LOG.warn("procedure WALs count=" + logs.size() +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        " above the warning threshold " + walCountWarnThreshold +<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        ". check running procedures to see if something is stuck.");<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span><a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    LOG.info("Rolled new Procedure Store WAL, id={}", logId);<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>    return true;<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>  }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>  private void closeCurrentLogStream() {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>    if (stream == null || logs.isEmpty()) {<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      return;<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>    try {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      ProcedureWALFile log = logs.getLast();<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      log.setProcIds(storeTracker.getUpdatedMinProcId(), storeTracker.getUpdatedMaxProcId());<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      log.updateLocalTracker(storeTracker);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>      long trailerSize = ProcedureWALFormat.writeTrailer(stream, storeTracker);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      log.addToSize(trailerSize);<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    } catch (IOException e) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>      LOG.warn("Unable to write the trailer: " + e.getMessage());<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    try {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      stream.close();<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    } catch (IOException e) {<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>      LOG.error("Unable to close the stream", e);<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    stream = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>  }<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span><a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  // ==========================================================================<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>  //  Log Files cleaner helpers<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  // ==========================================================================<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>  private void removeInactiveLogs() throws IOException {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    // We keep track of which procedures are holding the oldest WAL in 'holdingCleanupTracker'.<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    // once there is nothing olding the oldest WAL we can remove it.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    while (logs.size() &gt; 1 &amp;&amp; holdingCleanupTracker.isEmpty()) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      removeLogFile(logs.getFirst(), walArchiveDir);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>      buildHoldingCleanupTracker();<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span><a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    // TODO: In case we are holding up a lot of logs for long time we should<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    // rewrite old procedures (in theory parent procs) to the new WAL.<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>  }<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span><a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>  private void buildHoldingCleanupTracker() {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>    if (logs.size() &lt;= 1) {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      // we only have one wal, so nothing to do<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      holdingCleanupTracker.reset();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      return;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>    }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span><a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    // compute the holding tracker.<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    //  - the first WAL is used for the 'updates'<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    //  - the other WALs are scanned to remove procs already in other wals.<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    // TODO: exit early if holdingCleanupTracker.isEmpty()<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    holdingCleanupTracker.resetTo(logs.getFirst().getTracker(), true);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    holdingCleanupTracker.setDeletedIfSet(storeTracker);<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    for (int i = 1, size = logs.size() - 1; i &lt; size; ++i) {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      holdingCleanupTracker.setDeletedIfSet(logs.get(i).getTracker());<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<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>  /**<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>   * Remove all logs with logId &lt;= {@code lastLogId}.<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   */<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>  private void removeAllLogs(long lastLogId) {<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    if (logs.size() &lt;= 1) return;<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span><a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    if (LOG.isTraceEnabled()) {<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>      LOG.trace("Remove all state logs with ID less than " + lastLogId);<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    }<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span><a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    boolean removed = false;<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    while (logs.size() &gt; 1) {<a na

<TRUNCATED>

[06/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  private final String family = "f1";<a name="line.590"></a>
-<span class="sourceLin

<TRUNCATED>

[23/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
index 5034654..f02fb1d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.ManifestBuilder.html
@@ -75,151 +75,154 @@
 <span class="sourceLineNo">067</span>                                                          HRegionFileSystem, Path&gt; {<a name="line.67"></a>
 <span class="sourceLineNo">068</span>    private final Configuration conf;<a name="line.68"></a>
 <span class="sourceLineNo">069</span>    private final Path snapshotDir;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private final FileSystem fs;<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>    public ManifestBuilder(final Configuration conf, final FileSystem fs, final Path snapshotDir) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>      this.snapshotDir = snapshotDir;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      this.conf = conf;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      this.fs = fs;<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>    @Override<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public HRegionFileSystem regionOpen(final RegionInfo regionInfo) throws IOException {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      HRegionFileSystem snapshotRegionFs = HRegionFileSystem.createRegionOnFileSystem(conf,<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        fs, snapshotDir, regionInfo);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      return snapshotRegionFs;<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>    @Override<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    public void regionClose(final HRegionFileSystem region) {<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>    @Override<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public Path familyOpen(final HRegionFileSystem snapshotRegionFs, final byte[] familyName) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      Path familyDir = snapshotRegionFs.getStoreDir(Bytes.toString(familyName));<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return familyDir;<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>    @Override<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void familyClose(final HRegionFileSystem region, final Path family) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>    @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void storeFile(final HRegionFileSystem region, final Path familyDir,<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        final StoreFileInfo storeFile) throws IOException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      Path referenceFile = new Path(familyDir, storeFile.getPath().getName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      boolean success = true;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      if (storeFile.isReference()) {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        // write the Reference object to the snapshot<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        storeFile.getReference().write(fs, referenceFile);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      } else {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        // create "reference" to this store file.  It is intentionally an empty file -- all<a name="line.108"></a>
-<span class="sourceLineNo">109</span>        // necessary information is captured by its fs location and filename.  This allows us to<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        // only figure out what needs to be done via a single nn operation (instead of having to<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        // open and read the files as well).<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        success = fs.createNewFile(referenceFile);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      }<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      if (!success) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        throw new IOException("Failed to create reference file:" + referenceFile);<a name="line.115"></a>
+<span class="sourceLineNo">070</span>    private final FileSystem rootFs;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private final FileSystem workingDirFs;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public ManifestBuilder(final Configuration conf, final FileSystem rootFs,<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        final Path snapshotDir) throws IOException {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      this.snapshotDir = snapshotDir;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      this.conf = conf;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      this.rootFs = rootFs;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      this.workingDirFs = snapshotDir.getFileSystem(conf);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>    @Override<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    public HRegionFileSystem regionOpen(final RegionInfo regionInfo) throws IOException {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      HRegionFileSystem snapshotRegionFs = HRegionFileSystem.createRegionOnFileSystem(conf,<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        workingDirFs, snapshotDir, regionInfo);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return snapshotRegionFs;<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>    @Override<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    public void regionClose(final HRegionFileSystem region) {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>    @Override<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    public Path familyOpen(final HRegionFileSystem snapshotRegionFs, final byte[] familyName) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      Path familyDir = snapshotRegionFs.getStoreDir(Bytes.toString(familyName));<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      return familyDir;<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>    @Override<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void familyClose(final HRegionFileSystem region, final Path family) {<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>    @Override<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void storeFile(final HRegionFileSystem region, final Path familyDir,<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        final StoreFileInfo storeFile) throws IOException {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      Path referenceFile = new Path(familyDir, storeFile.getPath().getName());<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      boolean success = true;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      if (storeFile.isReference()) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        // write the Reference object to the snapshot<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        storeFile.getReference().write(workingDirFs, referenceFile);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      } else {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        // create "reference" to this store file.  It is intentionally an empty file -- all<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        // necessary information is captured by its fs location and filename.  This allows us to<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        // only figure out what needs to be done via a single nn operation (instead of having to<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        // open and read the files as well).<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        success = workingDirFs.createNewFile(referenceFile);<a name="line.115"></a>
 <span class="sourceLineNo">116</span>      }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      final Executor executor,final FileSystem fs, final Path snapshotDir,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      final SnapshotDescription desc) throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FileStatus[] regions = FSUtils.listStatus(fs, snapshotDir, new FSUtils.RegionDirFilter(fs));<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (regions == null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      LOG.debug("No regions under directory:" + snapshotDir);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      return null;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    for (final FileStatus region: regions) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          RegionInfo hri = HRegionFileSystem.loadRegionInfoFileContent(fs, region.getPath());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          return buildManifestFromDisk(conf, fs, snapshotDir, hri);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      });<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(regions.length);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    try {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      for (int i = 0; i &lt; regions.length; ++i) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        regionsManifest.add(completionService.take().get());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    } catch (InterruptedException e) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      throw new InterruptedIOException(e.getMessage());<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    } catch (ExecutionException e) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      IOException ex = new IOException();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      ex.initCause(e.getCause());<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      throw ex;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return regionsManifest;<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>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    fs.delete(new Path(snapshotDir, regionName), true);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  static SnapshotRegionManifest buildManifestFromDisk(final Configuration conf,<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      final FileSystem fs, final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, fs,<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          tableDir, regionInfo, true);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    // 1. dump region meta info into the snapshot directory<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    LOG.debug("Storing region-info for snapshot.");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>    // 2. iterate through all the stores in the region<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    LOG.debug("Creating references for hfiles");<a name="line.173"></a>
+<span class="sourceLineNo">117</span>      if (!success) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        throw new IOException("Failed to create reference file:" + referenceFile);<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>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      final Executor executor,final FileSystem fs, final Path snapshotDir,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      final SnapshotDescription desc) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    FileStatus[] regions = FSUtils.listStatus(fs, snapshotDir, new FSUtils.RegionDirFilter(fs));<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (regions == null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      LOG.debug("No regions under directory:" + snapshotDir);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      return null;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    for (final FileStatus region: regions) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        @Override<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          RegionInfo hri = HRegionFileSystem.loadRegionInfoFileContent(fs, region.getPath());<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          return buildManifestFromDisk(conf, fs, snapshotDir, hri);<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>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(regions.length);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      for (int i = 0; i &lt; regions.length; ++i) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        regionsManifest.add(completionService.take().get());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    } catch (InterruptedException e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      throw new InterruptedIOException(e.getMessage());<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    } catch (ExecutionException e) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      IOException ex = new IOException();<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      ex.initCause(e.getCause());<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      throw ex;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    return regionsManifest;<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>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    fs.delete(new Path(snapshotDir, regionName), true);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  static SnapshotRegionManifest buildManifestFromDisk(final Configuration conf,<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      final FileSystem fs, final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, fs,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          tableDir, regionInfo, true);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    // 1. dump region meta info into the snapshot directory<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    LOG.debug("Storing region-info for snapshot.");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files in<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    // batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    // checking to see if we have all the files until we are sure), but the limit is currently 1000<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // files/batch, far more than the number of store files under a single column family.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    if (familyNames != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      for (String familyName: familyNames) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName, false);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        if (storeFiles == null) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          LOG.debug("No files under family: " + familyName);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          continue;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>        // 2.1. build the snapshot reference for the store<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.190"></a>
-<span class="sourceLineNo">191</span>              SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        family.setFamilyName(UnsafeByteOperations.unsafeWrap(Bytes.toBytes(familyName)));<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>        if (LOG.isDebugEnabled()) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>          LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>        // 2.2. iterate through all the store's files and create "references".<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        int i = 0;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        int sz = storeFiles.size();<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        for (StoreFileInfo storeFile: storeFiles) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>          // create "reference" to this store file.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          LOG.debug("Adding reference for file ("+ (++i) +"/" + sz + "): " + storeFile.getPath());<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.204"></a>
-<span class="sourceLineNo">205</span>                SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          sfManifest.setName(storeFile.getPath().getName());<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          family.addStoreFiles(sfManifest.build());<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        manifest.addFamilyFiles(family.build());<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>    return manifest.build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>}<a name="line.214"></a>
+<span class="sourceLineNo">175</span>    // 2. iterate through all the stores in the region<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    LOG.debug("Creating references for hfiles");<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files in<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    // batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    // checking to see if we have all the files until we are sure), but the limit is currently 1000<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    // files/batch, far more than the number of store files under a single column family.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    if (familyNames != null) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      for (String familyName: familyNames) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName, false);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        if (storeFiles == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          LOG.debug("No files under family: " + familyName);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>          continue;<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>        // 2.1. build the snapshot reference for the store<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.193"></a>
+<span class="sourceLineNo">194</span>              SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        family.setFamilyName(UnsafeByteOperations.unsafeWrap(Bytes.toBytes(familyName)));<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>        if (LOG.isDebugEnabled()) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>        // 2.2. iterate through all the store's files and create "references".<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        int i = 0;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        int sz = storeFiles.size();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        for (StoreFileInfo storeFile: storeFiles) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          // create "reference" to this store file.<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          LOG.debug("Adding reference for file ("+ (++i) +"/" + sz + "): " + storeFile.getPath());<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.207"></a>
+<span class="sourceLineNo">208</span>                SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          sfManifest.setName(storeFile.getPath().getName());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          family.addStoreFiles(sfManifest.build());<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        manifest.addFamilyFiles(family.build());<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    return manifest.build();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>}<a name="line.217"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
index 5034654..f02fb1d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV1.html
@@ -75,151 +75,154 @@
 <span class="sourceLineNo">067</span>                                                          HRegionFileSystem, Path&gt; {<a name="line.67"></a>
 <span class="sourceLineNo">068</span>    private final Configuration conf;<a name="line.68"></a>
 <span class="sourceLineNo">069</span>    private final Path snapshotDir;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private final FileSystem fs;<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>    public ManifestBuilder(final Configuration conf, final FileSystem fs, final Path snapshotDir) {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>      this.snapshotDir = snapshotDir;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      this.conf = conf;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      this.fs = fs;<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>    @Override<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public HRegionFileSystem regionOpen(final RegionInfo regionInfo) throws IOException {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      HRegionFileSystem snapshotRegionFs = HRegionFileSystem.createRegionOnFileSystem(conf,<a name="line.80"></a>
-<span class="sourceLineNo">081</span>        fs, snapshotDir, regionInfo);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      return snapshotRegionFs;<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>    @Override<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    public void regionClose(final HRegionFileSystem region) {<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>    @Override<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public Path familyOpen(final HRegionFileSystem snapshotRegionFs, final byte[] familyName) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      Path familyDir = snapshotRegionFs.getStoreDir(Bytes.toString(familyName));<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return familyDir;<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>    @Override<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public void familyClose(final HRegionFileSystem region, final Path family) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>    @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    public void storeFile(final HRegionFileSystem region, final Path familyDir,<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        final StoreFileInfo storeFile) throws IOException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      Path referenceFile = new Path(familyDir, storeFile.getPath().getName());<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      boolean success = true;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      if (storeFile.isReference()) {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>        // write the Reference object to the snapshot<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        storeFile.getReference().write(fs, referenceFile);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      } else {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        // create "reference" to this store file.  It is intentionally an empty file -- all<a name="line.108"></a>
-<span class="sourceLineNo">109</span>        // necessary information is captured by its fs location and filename.  This allows us to<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        // only figure out what needs to be done via a single nn operation (instead of having to<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        // open and read the files as well).<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        success = fs.createNewFile(referenceFile);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      }<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      if (!success) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        throw new IOException("Failed to create reference file:" + referenceFile);<a name="line.115"></a>
+<span class="sourceLineNo">070</span>    private final FileSystem rootFs;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private final FileSystem workingDirFs;<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public ManifestBuilder(final Configuration conf, final FileSystem rootFs,<a name="line.73"></a>
+<span class="sourceLineNo">074</span>        final Path snapshotDir) throws IOException {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      this.snapshotDir = snapshotDir;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      this.conf = conf;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      this.rootFs = rootFs;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      this.workingDirFs = snapshotDir.getFileSystem(conf);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>    @Override<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    public HRegionFileSystem regionOpen(final RegionInfo regionInfo) throws IOException {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      HRegionFileSystem snapshotRegionFs = HRegionFileSystem.createRegionOnFileSystem(conf,<a name="line.83"></a>
+<span class="sourceLineNo">084</span>        workingDirFs, snapshotDir, regionInfo);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return snapshotRegionFs;<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>    @Override<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    public void regionClose(final HRegionFileSystem region) {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>    @Override<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    public Path familyOpen(final HRegionFileSystem snapshotRegionFs, final byte[] familyName) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      Path familyDir = snapshotRegionFs.getStoreDir(Bytes.toString(familyName));<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      return familyDir;<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>    @Override<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    public void familyClose(final HRegionFileSystem region, final Path family) {<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>    @Override<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    public void storeFile(final HRegionFileSystem region, final Path familyDir,<a name="line.103"></a>
+<span class="sourceLineNo">104</span>        final StoreFileInfo storeFile) throws IOException {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      Path referenceFile = new Path(familyDir, storeFile.getPath().getName());<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      boolean success = true;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      if (storeFile.isReference()) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        // write the Reference object to the snapshot<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        storeFile.getReference().write(workingDirFs, referenceFile);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      } else {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        // create "reference" to this store file.  It is intentionally an empty file -- all<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        // necessary information is captured by its fs location and filename.  This allows us to<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        // only figure out what needs to be done via a single nn operation (instead of having to<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        // open and read the files as well).<a name="line.114"></a>
+<span class="sourceLineNo">115</span>        success = workingDirFs.createNewFile(referenceFile);<a name="line.115"></a>
 <span class="sourceLineNo">116</span>      }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      final Executor executor,final FileSystem fs, final Path snapshotDir,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      final SnapshotDescription desc) throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FileStatus[] regions = FSUtils.listStatus(fs, snapshotDir, new FSUtils.RegionDirFilter(fs));<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (regions == null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      LOG.debug("No regions under directory:" + snapshotDir);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      return null;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    for (final FileStatus region: regions) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>        @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>          RegionInfo hri = HRegionFileSystem.loadRegionInfoFileContent(fs, region.getPath());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          return buildManifestFromDisk(conf, fs, snapshotDir, hri);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        }<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      });<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(regions.length);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    try {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      for (int i = 0; i &lt; regions.length; ++i) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        regionsManifest.add(completionService.take().get());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    } catch (InterruptedException e) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      throw new InterruptedIOException(e.getMessage());<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    } catch (ExecutionException e) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      IOException ex = new IOException();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      ex.initCause(e.getCause());<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      throw ex;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return regionsManifest;<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>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    fs.delete(new Path(snapshotDir, regionName), true);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  static SnapshotRegionManifest buildManifestFromDisk(final Configuration conf,<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      final FileSystem fs, final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, fs,<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          tableDir, regionInfo, true);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    // 1. dump region meta info into the snapshot directory<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    LOG.debug("Storing region-info for snapshot.");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>    // 2. iterate through all the stores in the region<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    LOG.debug("Creating references for hfiles");<a name="line.173"></a>
+<span class="sourceLineNo">117</span>      if (!success) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        throw new IOException("Failed to create reference file:" + referenceFile);<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>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      final Executor executor,final FileSystem fs, final Path snapshotDir,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      final SnapshotDescription desc) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    FileStatus[] regions = FSUtils.listStatus(fs, snapshotDir, new FSUtils.RegionDirFilter(fs));<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (regions == null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      LOG.debug("No regions under directory:" + snapshotDir);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      return null;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    for (final FileStatus region: regions) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        @Override<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          RegionInfo hri = HRegionFileSystem.loadRegionInfoFileContent(fs, region.getPath());<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          return buildManifestFromDisk(conf, fs, snapshotDir, hri);<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>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(regions.length);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    try {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      for (int i = 0; i &lt; regions.length; ++i) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        regionsManifest.add(completionService.take().get());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    } catch (InterruptedException e) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      throw new InterruptedIOException(e.getMessage());<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    } catch (ExecutionException e) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      IOException ex = new IOException();<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      ex.initCause(e.getCause());<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      throw ex;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    return regionsManifest;<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>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    fs.delete(new Path(snapshotDir, regionName), true);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  static SnapshotRegionManifest buildManifestFromDisk(final Configuration conf,<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      final FileSystem fs, final Path tableDir, final RegionInfo regionInfo) throws IOException {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    HRegionFileSystem regionFs = HRegionFileSystem.openRegionFromFileSystem(conf, fs,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>          tableDir, regionInfo, true);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    // 1. dump region meta info into the snapshot directory<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    LOG.debug("Storing region-info for snapshot.");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files in<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    // batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    // checking to see if we have all the files until we are sure), but the limit is currently 1000<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // files/batch, far more than the number of store files under a single column family.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    if (familyNames != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      for (String familyName: familyNames) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName, false);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        if (storeFiles == null) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          LOG.debug("No files under family: " + familyName);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          continue;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>        // 2.1. build the snapshot reference for the store<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.190"></a>
-<span class="sourceLineNo">191</span>              SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        family.setFamilyName(UnsafeByteOperations.unsafeWrap(Bytes.toBytes(familyName)));<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>        if (LOG.isDebugEnabled()) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>          LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>        // 2.2. iterate through all the store's files and create "references".<a name="line.198"></a>
-<span class="sourceLineNo">199</span>        int i = 0;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        int sz = storeFiles.size();<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        for (StoreFileInfo storeFile: storeFiles) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>          // create "reference" to this store file.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>          LOG.debug("Adding reference for file ("+ (++i) +"/" + sz + "): " + storeFile.getPath());<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.204"></a>
-<span class="sourceLineNo">205</span>                SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          sfManifest.setName(storeFile.getPath().getName());<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          family.addStoreFiles(sfManifest.build());<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        manifest.addFamilyFiles(family.build());<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>    return manifest.build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>}<a name="line.214"></a>
+<span class="sourceLineNo">175</span>    // 2. iterate through all the stores in the region<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    LOG.debug("Creating references for hfiles");<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>    // This ensures that we have an atomic view of the directory as long as we have &lt; ls limit<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // (batch size of the files in a directory) on the namenode. Otherwise, we get back the files in<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    // batches and may miss files being added/deleted. This could be more robust (iteratively<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    // checking to see if we have all the files until we are sure), but the limit is currently 1000<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    // files/batch, far more than the number of store files under a single column family.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    Collection&lt;String&gt; familyNames = regionFs.getFamilies();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    if (familyNames != null) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      for (String familyName: familyNames) {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        Collection&lt;StoreFileInfo&gt; storeFiles = regionFs.getStoreFiles(familyName, false);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        if (storeFiles == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          LOG.debug("No files under family: " + familyName);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>          continue;<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>        // 2.1. build the snapshot reference for the store<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.193"></a>
+<span class="sourceLineNo">194</span>              SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        family.setFamilyName(UnsafeByteOperations.unsafeWrap(Bytes.toBytes(familyName)));<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>        if (LOG.isDebugEnabled()) {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          LOG.debug("Adding snapshot references for " + storeFiles  + " hfiles");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>        // 2.2. iterate through all the store's files and create "references".<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        int i = 0;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        int sz = storeFiles.size();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        for (StoreFileInfo storeFile: storeFiles) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          // create "reference" to this store file.<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          LOG.debug("Adding reference for file ("+ (++i) +"/" + sz + "): " + storeFile.getPath());<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.207"></a>
+<span class="sourceLineNo">208</span>                SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          sfManifest.setName(storeFile.getPath().getName());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          family.addStoreFiles(sfManifest.build());<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        manifest.addFamilyFiles(family.build());<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    return manifest.build();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>}<a name="line.217"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
index 81c850b..1135952 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.ManifestBuilder.html
@@ -77,131 +77,134 @@
 <span class="sourceLineNo">069</span>                    SnapshotRegionManifest.Builder, SnapshotRegionManifest.FamilyFiles.Builder&gt; {<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    private final Configuration conf;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private final Path snapshotDir;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private final FileSystem fs;<a name="line.72"></a>
+<span class="sourceLineNo">072</span>    private final FileSystem rootFs;<a name="line.72"></a>
 <span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>    public ManifestBuilder(final Configuration conf, final FileSystem fs, final Path snapshotDir) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      this.snapshotDir = snapshotDir;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      this.conf = conf;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      this.fs = fs;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>    @Override<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    public SnapshotRegionManifest.Builder regionOpen(final RegionInfo regionInfo) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return manifest;<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>    @Override<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    public void regionClose(final SnapshotRegionManifest.Builder region) throws IOException {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      // we should ensure the snapshot dir exist, maybe it has been deleted by master<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      // see HBASE-16464<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      if (fs.exists(snapshotDir)) {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        SnapshotRegionManifest manifest = region.build();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>        FSDataOutputStream stream = fs.create(getRegionManifestPath(snapshotDir, manifest));<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        try {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>          manifest.writeTo(stream);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>        } finally {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>          stream.close();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>        }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      } else {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        LOG.warn("can't write manifest without parent dir, maybe it has been deleted by master?");<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><a name="line.103"></a>
-<span class="sourceLineNo">104</span>    @Override<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    public SnapshotRegionManifest.FamilyFiles.Builder familyOpen(<a name="line.105"></a>
-<span class="sourceLineNo">106</span>        final SnapshotRegionManifest.Builder region, final byte[] familyName) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.107"></a>
-<span class="sourceLineNo">108</span>          SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      family.setFamilyName(UnsafeByteOperations.unsafeWrap(familyName));<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      return family;<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 familyClose(final SnapshotRegionManifest.Builder region,<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        final SnapshotRegionManifest.FamilyFiles.Builder family) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      region.addFamilyFiles(family.build());<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>    @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    public void storeFile(final SnapshotRegionManifest.Builder region,<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        final SnapshotRegionManifest.FamilyFiles.Builder family, final StoreFileInfo storeFile)<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>            SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      sfManifest.setName(storeFile.getPath().getName());<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      if (storeFile.isReference()) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        sfManifest.setReference(storeFile.getReference().convert());<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      sfManifest.setFileSize(storeFile.getReferencedFileStatus(fs).getLen());<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      family.addStoreFiles(sfManifest.build());<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><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final Executor executor, final FileSystem fs, final Path snapshotDir,<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      final SnapshotDescription desc, final int manifestSizeLimit) throws IOException {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    FileStatus[] manifestFiles = FSUtils.listStatus(fs, snapshotDir, new PathFilter() {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      public boolean accept(Path path) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        return path.getName().startsWith(SNAPSHOT_MANIFEST_PREFIX);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    });<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>    if (manifestFiles == null || manifestFiles.length == 0) return null;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    for (final FileStatus st: manifestFiles) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          FSDataInputStream stream = fs.open(st.getPath());<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          CodedInputStream cin = CodedInputStream.newInstance(stream);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>          cin.setSizeLimit(manifestSizeLimit);<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>          try {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>            return SnapshotRegionManifest.parseFrom(cin);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>          } finally {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>            stream.close();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>          }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        }<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      });<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(manifestFiles.length);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    try {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      for (int i = 0; i &lt; manifestFiles.length; ++i) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        regionsManifest.add(completionService.take().get());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    } catch (InterruptedException e) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      throw new InterruptedIOException(e.getMessage());<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    } catch (ExecutionException e) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Throwable t = e.getCause();<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>      if(t instanceof InvalidProtocolBufferException) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        throw (InvalidProtocolBufferException)t;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      } else {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        IOException ex = new IOException("ExecutionException");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        ex.initCause(e.getCause());<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        throw ex;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return regionsManifest;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    fs.delete(getRegionManifestPath(snapshotDir, manifest), true);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private static Path getRegionManifestPath(final Path snapshotDir,<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      final SnapshotRegionManifest manifest) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    return new Path(snapshotDir, SNAPSHOT_MANIFEST_PREFIX + regionName);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>}<a name="line.196"></a>
+<span class="sourceLineNo">074</span>    public ManifestBuilder(final Configuration conf, final FileSystem rootFs,<a name="line.74"></a>
+<span class="sourceLineNo">075</span>        final Path snapshotDir) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      this.snapshotDir = snapshotDir;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      this.conf = conf;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      this.rootFs = rootFs;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    }<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>    @Override<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    public SnapshotRegionManifest.Builder regionOpen(final RegionInfo regionInfo) {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      SnapshotRegionManifest.Builder manifest = SnapshotRegionManifest.newBuilder();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      manifest.setRegionInfo(ProtobufUtil.toRegionInfo(regionInfo));<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return manifest;<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>    @Override<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    public void regionClose(final SnapshotRegionManifest.Builder region) throws IOException {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      // we should ensure the snapshot dir exist, maybe it has been deleted by master<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      // see HBASE-16464<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      FileSystem workingDirFs = snapshotDir.getFileSystem(this.conf);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      if (workingDirFs.exists(snapshotDir)) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        SnapshotRegionManifest manifest = region.build();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>        FSDataOutputStream stream = workingDirFs.create(<a name="line.95"></a>
+<span class="sourceLineNo">096</span>            getRegionManifestPath(snapshotDir, manifest));<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        try {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>          manifest.writeTo(stream);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        } finally {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>          stream.close();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        }<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      } else {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>        LOG.warn("can't write manifest without parent dir, maybe it has been deleted by master?");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      }<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public SnapshotRegionManifest.FamilyFiles.Builder familyOpen(<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        final SnapshotRegionManifest.Builder region, final byte[] familyName) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      SnapshotRegionManifest.FamilyFiles.Builder family =<a name="line.110"></a>
+<span class="sourceLineNo">111</span>          SnapshotRegionManifest.FamilyFiles.newBuilder();<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      family.setFamilyName(UnsafeByteOperations.unsafeWrap(familyName));<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      return family;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    @Override<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    public void familyClose(final SnapshotRegionManifest.Builder region,<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        final SnapshotRegionManifest.FamilyFiles.Builder family) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      region.addFamilyFiles(family.build());<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>
+<span class="sourceLineNo">122</span>    @Override<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public void storeFile(final SnapshotRegionManifest.Builder region,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        final SnapshotRegionManifest.FamilyFiles.Builder family, final StoreFileInfo storeFile)<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      SnapshotRegionManifest.StoreFile.Builder sfManifest =<a name="line.126"></a>
+<span class="sourceLineNo">127</span>            SnapshotRegionManifest.StoreFile.newBuilder();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      sfManifest.setName(storeFile.getPath().getName());<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (storeFile.isReference()) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        sfManifest.setReference(storeFile.getReference().convert());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      sfManifest.setFileSize(storeFile.getReferencedFileStatus(rootFs).getLen());<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      family.addStoreFiles(sfManifest.build());<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">137</span>  static List&lt;SnapshotRegionManifest&gt; loadRegionManifests(final Configuration conf,<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      final Executor executor, final FileSystem fs, final Path snapshotDir,<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final SnapshotDescription desc, final int manifestSizeLimit) throws IOException {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    FileStatus[] manifestFiles = FSUtils.listStatus(fs, snapshotDir, new PathFilter() {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      @Override<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      public boolean accept(Path path) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        return path.getName().startsWith(SNAPSHOT_MANIFEST_PREFIX);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      }<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    });<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    if (manifestFiles == null || manifestFiles.length == 0) return null;<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final ExecutorCompletionService&lt;SnapshotRegionManifest&gt; completionService =<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      new ExecutorCompletionService&lt;&gt;(executor);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    for (final FileStatus st: manifestFiles) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      completionService.submit(new Callable&lt;SnapshotRegionManifest&gt;() {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        public SnapshotRegionManifest call() throws IOException {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>          FSDataInputStream stream = fs.open(st.getPath());<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          CodedInputStream cin = CodedInputStream.newInstance(stream);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          cin.setSizeLimit(manifestSizeLimit);<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>          try {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>            return SnapshotRegionManifest.parseFrom(cin);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>          } finally {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>            stream.close();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          }<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      });<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>    ArrayList&lt;SnapshotRegionManifest&gt; regionsManifest = new ArrayList&lt;&gt;(manifestFiles.length);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    try {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      for (int i = 0; i &lt; manifestFiles.length; ++i) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        regionsManifest.add(completionService.take().get());<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      }<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    } catch (InterruptedException e) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throw new InterruptedIOException(e.getMessage());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    } catch (ExecutionException e) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      Throwable t = e.getCause();<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>      if(t instanceof InvalidProtocolBufferException) {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        throw (InvalidProtocolBufferException)t;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      } else {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>        IOException ex = new IOException("ExecutionException");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        ex.initCause(e.getCause());<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        throw ex;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    return regionsManifest;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  static void deleteRegionManifest(final FileSystem fs, final Path snapshotDir,<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      final SnapshotRegionManifest manifest) throws IOException {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    fs.delete(getRegionManifestPath(snapshotDir, manifest), true);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private static Path getRegionManifestPath(final Path snapshotDir,<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      final SnapshotRegionManifest manifest) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    String regionName = SnapshotManifest.getRegionNameFromManifest(manifest);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    return new Path(snapshotDir, SNAPSHOT_MANIFEST_PREFIX + regionName);<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>
 
 
 


[03/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
index 826bcba..5323511 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/rest/TestTableScan.CustomFilter.html
@@ -98,580 +98,623 @@
 <span class="sourceLineNo">090</span>  private static final String CFB = "b";<a name="line.90"></a>
 <span class="sourceLineNo">091</span>  private static final String COLUMN_1 = CFA + ":1";<a name="line.91"></a>
 <span class="sourceLineNo">092</span>  private static final String COLUMN_2 = CFB + ":2";<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static Client client;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private static int expectedRows1;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static int expectedRows2;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static Configuration conf;<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    new HBaseRESTTestingUtility();<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @BeforeClass<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public static void setUpBeforeClass() throws Exception {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    conf = TEST_UTIL.getConfiguration();<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    TEST_UTIL.startMiniCluster();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    client = new Client(new Cluster().add("localhost",<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      REST_TEST_UTIL.getServletPort()));<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    if (!admin.tableExists(TABLE)) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    htd.addFamily(new HColumnDescriptor(CFA));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    htd.addFamily(new HColumnDescriptor(CFB));<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    admin.createTable(htd);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<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>  @AfterClass<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public static void tearDownAfterClass() throws Exception {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Test<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    // Test scanning particular columns<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    StringBuilder builder = new StringBuilder();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    builder.append("/*");<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    builder.append("?");<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    builder.append("&amp;");<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      Constants.MIMETYPE_XML);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    assertEquals(200, response.getCode());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    int count = TestScannerResource.countCellSet(model);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    assertEquals(10, count);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    checkRowsNotNull(model);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>    //Test with no limit.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    builder = new StringBuilder();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    builder.append("/*");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    builder.append("?");<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      Constants.MIMETYPE_XML);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    assertEquals(200, response.getCode());<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    count = TestScannerResource.countCellSet(model);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    assertEquals(expectedRows1, count);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    checkRowsNotNull(model);<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    //Test with start and end row.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    builder = new StringBuilder();<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    builder.append("/*");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    builder.append("?");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    builder.append("&amp;");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    builder.append("&amp;");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Constants.MIMETYPE_XML);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    assertEquals(200, response.getCode());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    count = TestScannerResource.countCellSet(model);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    RowModel startRow = model.getRows().get(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    assertEquals(24, count);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    checkRowsNotNull(model);<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    //Test with start row and limit.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    builder = new StringBuilder();<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    builder.append("/*");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    builder.append("?");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    builder.append("&amp;");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    builder.append("&amp;");<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      Constants.MIMETYPE_XML);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    assertEquals(200, response.getCode());<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    startRow = model.getRows().get(0);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    count = TestScannerResource.countCellSet(model);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    assertEquals(15, count);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    checkRowsNotNull(model);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    // Test scanning particular columns with limit.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    StringBuilder builder = new StringBuilder();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    builder.append("/*");<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    builder.append("?");<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    builder.append("&amp;");<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      Constants.MIMETYPE_JSON);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    assertEquals(200, response.getCode());<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    int count = TestScannerResource.countCellSet(model);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    assertEquals(2, count);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    checkRowsNotNull(model);<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    //Test scanning with no limit.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    builder = new StringBuilder();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    builder.append("/*");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    builder.append("?");<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      Constants.MIMETYPE_JSON);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    assertEquals(200, response.getCode());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    count = TestScannerResource.countCellSet(model);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    assertEquals(expectedRows2, count);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    checkRowsNotNull(model);<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>    //Test with start row and end row.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    builder = new StringBuilder();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    builder.append("/*");<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    builder.append("?");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    builder.append("&amp;");<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    builder.append("&amp;");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      Constants.MIMETYPE_JSON);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    assertEquals(200, response.getCode());<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    RowModel startRow = model.getRows().get(0);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    count = TestScannerResource.countCellSet(model);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    assertEquals(24, count);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    checkRowsNotNull(model);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * @throws Exception the exception<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  @Test<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    StringBuilder builder = new StringBuilder();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    builder.append("/*");<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    builder.append("?");<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    builder.append("&amp;");<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      Constants.MIMETYPE_XML);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    assertEquals(200, response.getCode());<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      CellModel.class);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        assertTrue(row.getKey() != null);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    };<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        @Override<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>        @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    });<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // create a new XML parser<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    factory.setNamespaceAware(true);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    reader.parse(new InputSource(response.getStream()));<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>  @Test<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public void testStreamingJSON() throws Exception {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    //Test with start row and end row.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    StringBuilder builder = new StringBuilder();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    builder.append("/*");<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    builder.append("?");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    builder.append("&amp;");<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    builder.append("&amp;");<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      Constants.MIMETYPE_JSON);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    assertEquals(200, response.getCode());<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>    int count = 0;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean found = false;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        assertNotNull(row.getKey());<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          if (count == 0) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          if (count == 23) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.347"></a>
+<span class="sourceLineNo">093</span>  private static final String COLUMN_EMPTY = CFA + ":";<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private static Client client;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static int expectedRows1;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private static int expectedRows2;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private static int expectedRows3;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  private static Configuration conf;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final HBaseRESTTestingUtility REST_TEST_UTIL =<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    new HBaseRESTTestingUtility();<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  @BeforeClass<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static void setUpBeforeClass() throws Exception {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    conf = TEST_UTIL.getConfiguration();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    conf.set(Constants.CUSTOM_FILTERS, "CustomFilter:" + CustomFilter.class.getName());<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    TEST_UTIL.startMiniCluster();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    REST_TEST_UTIL.startServletContainer(conf);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    client = new Client(new Cluster().add("localhost",<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      REST_TEST_UTIL.getServletPort()));<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    Admin admin = TEST_UTIL.getAdmin();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    if (!admin.tableExists(TABLE)) {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      HTableDescriptor htd = new HTableDescriptor(TABLE);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      htd.addFamily(new HColumnDescriptor(CFA));<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      htd.addFamily(new HColumnDescriptor(CFB));<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      admin.createTable(htd);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      expectedRows1 = TestScannerResource.insertData(conf, TABLE, COLUMN_1, 1.0);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      expectedRows2 = TestScannerResource.insertData(conf, TABLE, COLUMN_2, 0.5);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      expectedRows3 = TestScannerResource.insertData(conf, TABLE, COLUMN_EMPTY, 1.0);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @AfterClass<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static void tearDownAfterClass() throws Exception {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    TEST_UTIL.getAdmin().disableTable(TABLE);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    TEST_UTIL.getAdmin().deleteTable(TABLE);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    REST_TEST_UTIL.shutdownServletContainer();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  @Test<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  public void testSimpleScannerXML() throws IOException, JAXBException, XMLStreamException {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Test scanning particular columns<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    StringBuilder builder = new StringBuilder();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    builder.append("/*");<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    builder.append("?");<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    builder.append("&amp;");<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      Constants.MIMETYPE_XML);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    assertEquals(200, response.getCode());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    int count = TestScannerResource.countCellSet(model);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    assertEquals(10, count);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    checkRowsNotNull(model);<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    //Test with no limit.<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    builder = new StringBuilder();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    builder.append("/*");<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    builder.append("?");<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      Constants.MIMETYPE_XML);<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    assertEquals(200, response.getCode());<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    count = TestScannerResource.countCellSet(model);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    assertEquals(expectedRows1, count);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    checkRowsNotNull(model);<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    //Test with start and end row.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    builder = new StringBuilder();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    builder.append("/*");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    builder.append("?");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    builder.append("&amp;");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    builder.append("&amp;");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      Constants.MIMETYPE_XML);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    assertEquals(200, response.getCode());<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    count = TestScannerResource.countCellSet(model);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    RowModel startRow = model.getRows().get(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertEquals(24, count);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    checkRowsNotNull(model);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    //Test with start row and limit.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    builder = new StringBuilder();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    builder.append("/*");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    builder.append("?");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    builder.append("&amp;");<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    builder.append("&amp;");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      Constants.MIMETYPE_XML);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    assertEquals(200, response.getCode());<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    startRow = model.getRows().get(0);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    count = TestScannerResource.countCellSet(model);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    assertEquals(15, count);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    checkRowsNotNull(model);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @Test<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public void testSimpleScannerJson() throws IOException, JAXBException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Test scanning particular columns with limit.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    StringBuilder builder = new StringBuilder();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    builder.append("/*");<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    builder.append("?");<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    builder.append("&amp;");<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    builder.append(Constants.SCAN_LIMIT + "=2");<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      Constants.MIMETYPE_JSON);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    assertEquals(200, response.getCode());<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    int count = TestScannerResource.countCellSet(model);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    assertEquals(2, count);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    checkRowsNotNull(model);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><a name="line.227"></a>
+<span class="sourceLineNo">228</span>    //Test scanning with no limit.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    builder = new StringBuilder();<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    builder.append("/*");<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    builder.append("?");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_2);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      Constants.MIMETYPE_JSON);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    assertEquals(200, response.getCode());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    count = TestScannerResource.countCellSet(model);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    assertEquals(expectedRows2, count);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    checkRowsNotNull(model);<a name="line.240"></a>
+<span class="sourceLineNo">241</span><a name="line.241"></a>
+<span class="sourceLineNo">242</span>    //Test with start row and end row.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    builder = new StringBuilder();<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    builder.append("/*");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    builder.append("?");<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    builder.append("&amp;");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    builder.append("&amp;");<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      Constants.MIMETYPE_JSON);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    assertEquals(200, response.getCode());<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    RowModel startRow = model.getRows().get(0);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    assertEquals("aaa", Bytes.toString(startRow.getKey()));<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    RowModel endRow = model.getRows().get(model.getRows().size() - 1);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    assertEquals("aax", Bytes.toString(endRow.getKey()));<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    count = TestScannerResource.countCellSet(model);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    assertEquals(24, count);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    checkRowsNotNull(model);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>  /**<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * An example to scan using listener in unmarshaller for XML.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @throws Exception the exception<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public void testScanUsingListenerUnmarshallerXML() throws Exception {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    StringBuilder builder = new StringBuilder();<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    builder.append("/*");<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    builder.append("?");<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    builder.append("&amp;");<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    builder.append(Constants.SCAN_LIMIT + "=10");<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      Constants.MIMETYPE_XML);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    assertEquals(200, response.getCode());<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    assertEquals(Constants.MIMETYPE_XML, response.getHeader("content-type"));<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    JAXBContext context = JAXBContext.newInstance(ClientSideCellSetModel.class, RowModel.class,<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      CellModel.class);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    Unmarshaller unmarshaller = context.createUnmarshaller();<a name="line.282"></a>
+<span class="sourceLineNo">283</span><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    final ClientSideCellSetModel.Listener listener = new ClientSideCellSetModel.Listener() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      @Override<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      public void handleRowModel(ClientSideCellSetModel helper, RowModel row) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        assertTrue(row.getKey() != null);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        assertTrue(row.getCells().size() &gt; 0);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    };<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // install the callback on all ClientSideCellSetModel instances<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    unmarshaller.setListener(new Unmarshaller.Listener() {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        @Override<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        public void beforeUnmarshal(Object target, Object parent) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(listener);<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>        @Override<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        public void afterUnmarshal(Object target, Object parent) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            if (target instanceof ClientSideCellSetModel) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>                ((ClientSideCellSetModel) target).setCellSetModelListener(null);<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>    });<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // create a new XML parser<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    SAXParserFactory factory = SAXParserFactory.newInstance();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    factory.setNamespaceAware(true);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    XMLReader reader = factory.newSAXParser().getXMLReader();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    reader.setContentHandler(unmarshaller.getUnmarshallerHandler());<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    assertFalse(ClientSideCellSetModel.listenerInvoked);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    reader.parse(new InputSource(response.getStream()));<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    assertTrue(ClientSideCellSetModel.listenerInvoked);<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><a name="line.319"></a>
+<span class="sourceLineNo">320</span>  @Test<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  public void testStreamingJSON() throws Exception {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    //Test with start row and end row.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    StringBuilder builder = new StringBuilder();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    builder.append("/*");<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    builder.append("?");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    builder.append("&amp;");<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    builder.append("&amp;");<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      Constants.MIMETYPE_JSON);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    assertEquals(200, response.getCode());<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    int count = 0;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider()<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        .locateMapper(CellSetModel.class, MediaType.APPLICATION_JSON_TYPE);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    JsonFactory jfactory = new JsonFactory(mapper);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    JsonParser jParser = jfactory.createJsonParser(response.getStream());<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean found = false;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    while (jParser.nextToken() != JsonToken.END_OBJECT) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      if(jParser.getCurrentToken() == JsonToken.START_OBJECT &amp;&amp; found) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        RowModel row = jParser.readValueAs(RowModel.class);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        assertNotNull(row.getKey());<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        for (int i = 0; i &lt; row.getCells().size(); i++) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>          if (count == 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("aaa", Bytes.toString(row.getKey()));<a name="line.347"></a>
 <span class="sourceLineNo">348</span>          }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          count++;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        }<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        jParser.skipChildren();<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      } else {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    assertEquals(24, count);<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>  @Test<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    StringBuilder builder = new StringBuilder();<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    builder.append("/*");<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    builder.append("?");<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    builder.append("&amp;");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    assertEquals(200, response.getCode());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    assertEquals(15, rowCount);<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>    //Test with start row and end row.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    builder = new StringBuilder();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    builder.append("/*");<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    builder.append("?");<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    builder.append("&amp;");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    builder.append("&amp;");<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    assertEquals(200, response.getCode());<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    rowCount = readProtobufStream(response.getStream());<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    assertEquals(24, rowCount);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private void checkRowsNotNull(CellSetModel model) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    for (RowModel row: model.getRows()) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      assertTrue(row.getKey() != null);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    }<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>   * Read protobuf stream.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * @param inputStream the input stream<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * @return The number of rows in the cell set model.<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    CellSetModel model = null;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    int rowCount = 0;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    try {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      while (true) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        byte[] lengthBytes = new byte[2];<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        int readBytes = stream.read(lengthBytes);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        if (readBytes == -1) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          break;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        assertEquals(2, readBytes);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        int length = Bytes.toShort(lengthBytes);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        byte[] cellset = new byte[length];<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        stream.read(cellset);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        model = new CellSetModel();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        model.getObjectFromMessage(cellset);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        checkRowsNotNull(model);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    } catch (EOFException exp) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      exp.printStackTrace();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    } finally {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      stream.close();<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return rowCount;<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>  @Test<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    // Test scanning particular columns with limit.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    StringBuilder builder = new StringBuilder();<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    builder.append("/*");<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    builder.append("?");<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      Constants.MIMETYPE_JSON);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    assertEquals(200, response.getCode());<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    int count = TestScannerResource.countCellSet(model);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    assertEquals(0, count);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>  @Test<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  public void testSimpleFilter() throws IOException, JAXBException {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    StringBuilder builder = new StringBuilder();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    builder.append("/*");<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    builder.append("?");<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    builder.append("&amp;");<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    builder.append("&amp;");<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    builder.append("&amp;");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("PrefixFilter('aab')", "UTF-8"));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    Response response =<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(200, response.getCode());<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    int count = TestScannerResource.countCellSet(model);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    assertEquals(1, count);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    assertEquals("aab",<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Test<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void testQualifierAndPrefixFilters() throws IOException, JAXBException {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    StringBuilder builder = new StringBuilder();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    builder.append("/abc*");<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    builder.append("?");<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + URLEncoder.encode("QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    Response response =<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    assertEquals(200, response.getCode());<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    int count = TestScannerResource.countCellSet(model);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    assertEquals(1, count);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    assertEquals("abc",<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  @Test<a name="line.493"></a>
-<span class="sourceLineNo">494</span>  public void testCompoundFilter() throws IOException, JAXBException {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    StringBuilder builder = new StringBuilder();<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    builder.append("/*");<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    builder.append("?");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    builder.append(Constants.SCAN_FILTER + "="<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        + URLEncoder.encode("PrefixFilter('abc') AND QualifierFilter(=,'binary:1')", "UTF-8"));<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    Response response =<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    assertEquals(200, response.getCode());<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    int count = TestScannerResource.countCellSet(model);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assertEquals(1, count);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    assertEquals("abc",<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.509"></a>
-<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>  @Test<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  public void testCustomFilter() throws IOException, JAXBException {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    StringBuilder builder = new StringBuilder();<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    builder.append("/a*");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    builder.append("?");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    builder.append("&amp;");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    Response response =<a name="line.520"></a>
-<span class="sourceLineNo">521</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertEquals(200, response.getCode());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    int count = TestScannerResource.countCellSet(model);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    assertEquals(1, count);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    assertEquals("abc",<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        new String(model.getRows().get(0).getCells().get(0).getValue(), StandardCharsets.UTF_8));<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>  @Test<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public void testNegativeCustomFilter() throws IOException, JAXBException {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    StringBuilder builder = new StringBuilder();<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    builder.append("/b*");<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    builder.append("?");<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    builder.append("&amp;");<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    builder.append(Constants.SCAN_FILTER + "=" + URLEncoder.encode("CustomFilter('abc')", "UTF-8"));<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    Response response =<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    assertEquals(200, response.getCode());<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    int count = TestScannerResource.countCellSet(model);<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    // Should return no rows as the filters conflict<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    assertEquals(0, count);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
-<span class="sourceLineNo">550</span><a name="line.550"></a>
-<span class="sourceLineNo">551</span>  @Test<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  public void testReversed() throws IOException, JAXBException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    StringBuilder builder = new StringBuilder();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    builder.append("/*");<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    builder.append("?");<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    builder.append("&amp;");<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    builder.append("&amp;");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Response response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    assertEquals(200, response.getCode());<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    JAXBContext ctx = JAXBContext.newInstance(CellSetModel.class);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    Unmarshaller ush = ctx.createUnmarshaller();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    CellSetModel model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    int count = TestScannerResource.countCellSet(model);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    assertEquals(24, count);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    List&lt;RowModel&gt; rowModels = model.getRows().subList(1, count);<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    //reversed<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    builder = new StringBuilder();<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    builder.append("/*");<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    builder.append("?");<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    builder.append("&amp;");<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    builder.append(Constants.SCAN_START_ROW + "=aay");<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    builder.append("&amp;");<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    builder.append(Constants.SCAN_END_ROW + "=aaa");<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    builder.append("&amp;");<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    builder.append(Constants.SCAN_REVERSED + "=true");<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    response = client.get("/" + TABLE + builder.toString(), Constants.MIMETYPE_XML);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    assertEquals(200, response.getCode());<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    model = (CellSetModel) ush.unmarshal(response.getStream());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    count = TestScannerResource.countCellSet(model);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    assertEquals(24, count);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    List&lt;RowModel&gt; reversedRowModels = model.getRows().subList(1, count);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>    Collections.reverse(reversedRowModels);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    assertEquals(rowModels.size(), reversedRowModels.size());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    for (int i = 0; i &lt; rowModels.size(); i++) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      RowModel rowModel = rowModels.get(i);<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      RowModel reversedRowModel = reversedRowModels.get(i);<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>      assertEquals(new String(rowModel.getKey(), "UTF-8"),<a name="line.594"></a>
-<span class="sourceLineNo">595</span>          new String(reversedRowModel.getKey(), "UTF-8"));<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      assertEquals(new String(rowModel.getCells().get(0).getValue(), "UTF-8"),<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          new String(reversedRowModel.getCells().get(0).getValue(), "UTF-8"));<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>  public static class CustomFilter extends PrefixFilter {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    private byte[] key = null;<a name="line.602"></a>
+<span class="sourceLineNo">349</span>          if (count == 23) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            assertEquals("aax", Bytes.toString(row.getKey()));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          }<a name="line.351"></a>
+<span class="sourceLineNo">352</span>          count++;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        jParser.skipChildren();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      } else {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        found = jParser.getCurrentToken() == JsonToken.START_ARRAY;<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>    assertEquals(24, count);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Test<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public void testSimpleScannerProtobuf() throws Exception {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    StringBuilder builder = new StringBuilder();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    builder.append("/*");<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    builder.append("?");<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    builder.append("&amp;");<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    builder.append(Constants.SCAN_LIMIT + "=15");<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Response response = client.get("/" + TABLE + builder.toString(),<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    assertEquals(200, response.getCode());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    int rowCount = readProtobufStream(response.getStream());<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    assertEquals(15, rowCount);<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>    //Test with start row and end row.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    builder = new StringBuilder();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    builder.append("/*");<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    builder.append("?");<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    builder.append(Constants.SCAN_COLUMN + "=" + COLUMN_1);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    builder.append("&amp;");<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    builder.append(Constants.SCAN_START_ROW + "=aaa");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    builder.append("&amp;");<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    builder.append(Constants.SCAN_END_ROW + "=aay");<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    response = client.get("/" + TABLE + builder.toString(),<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      Constants.MIMETYPE_PROTOBUF);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    assertEquals(200, response.getCode());<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    assertEquals(Constants.MIMETYPE_PROTOBUF, response.getHeader("content-type"));<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    rowCount = readProtobufStream(response.getStream());<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    assertEquals(24, rowCount);<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>  private void checkRowsNotNull(CellSetModel model) {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    for (RowModel row: model.getRows()) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      assertTrue(row.getKey() != null);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      assertTrue(row.getCells().size() &gt; 0);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * Read protobuf stream.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   * @param inputStream the input stream<a name="line.403"></a>
+<span class="sourceLineNo">404</span>   * @return The number of rows in the cell set model.<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   * @throws IOException Signals that an I/O exception has occurred.<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   */<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  public int readProtobufStream(InputStream inputStream) throws IOException{<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    DataInputStream stream = new DataInputStream(inputStream);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    CellSetModel model = null;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    int rowCount = 0;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      while (true) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        byte[] lengthBytes = new byte[2];<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        int readBytes = stream.read(lengthBytes);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        if (readBytes == -1) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          break;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        assertEquals(2, readBytes);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        int length = Bytes.toShort(lengthBytes);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        byte[] cellset = new byte[length];<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        stream.read(cellset);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        model = new CellSetModel();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        model.getObjectFromMessage(cellset);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        checkRowsNotNull(model);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        rowCount = rowCount + TestScannerResource.countCellSet(model);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    } catch (EOFException exp) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      exp.printStackTrace();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    } finally {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      stream.close();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    return rowCount;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  @Test<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public void testScanningUnknownColumnJson() throws IOException, JAXBException {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    // Test scanning particular columns with limit.<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    StringBuilder builder = new StringBuilder();<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    builder.append("/*");<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    builder.append("?");<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    builder.append(Constants.SCAN_COLUMN + "=a:test");<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    Response response = client.get("/" + TABLE  + builder.toString(),<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Constants.MIMETYPE_JSON);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    assertEquals(200, response.getCode());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    assertEquals(Constants.MIMETYPE_JSON, response.getHeader("content-type"));<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    ObjectMapper mapper = new JacksonJaxbJsonProvider().locateMapper(CellSetModel.class,<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      MediaType.APPLICATION_JSON_TYPE);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    CellSetModel model = mapper.readValue(response.getStream(), CellSetModel.class);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    int count = TestScannerResource.countCellSet(model);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    assertEquals(0, count);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>  @Test<a name="line.453"></a>
+<span class=

<TRUNCATED>

[07/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
index 7ed37ca..907a45d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html
@@ -28,713 +28,752 @@
 <span class="sourceLineNo">020</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam1;<a name="line.20"></a>
 <span class="sourceLineNo">021</span>import static org.apache.hadoop.hbase.HBaseTestingUtility.fam2;<a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.junit.Assert.assertEquals;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import static org.junit.Assert.fail;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Objects;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.Random;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.CountDownLatch;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileSystem;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.Path;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.Cell;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HConstants;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.TableName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Append;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Get;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Result;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.After;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.junit.Before;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.junit.ClassRule;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.junit.Rule;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.junit.Test;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.junit.experimental.categories.Category;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.junit.rules.TestName;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.slf4j.Logger;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * and HRegion.append<a name="line.83"></a>
-<span class="sourceLineNo">084</span> */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.85"></a>
-<span class="sourceLineNo">086</span>public class TestAtomicOperation {<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @ClassRule<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @Rule public TestName name = new TestName();<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  HRegion region = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.96"></a>
-<span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Test names<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  static  byte[] tableName;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Before<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void setup() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    tableName = Bytes.toBytes(name.getMethodName());<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>  @After<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public void teardown() throws IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (region != null) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      region.close();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      WAL wal = region.getWAL();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      if (wal != null) wal.close();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      if (bc != null) bc.shutdown();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      region = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  // individual code pieces in the HRegion.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Test basic append operation.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * More tests in<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  @Test<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public void testAppend() throws IOException {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    " The Universe, and Everything";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String v2 = " is... 42.";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    Append a = new Append(row);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    a.setReturnResults(false);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    a = new Append(row);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  @Test<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    final String v1 = "Value";<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    final Append a = new Append(row);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    Result result = null;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      assertEquals(null, result);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    } catch (Exception e) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Test<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final Increment inc = new Increment(row);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    inc.addColumn(fam1, qual1, 1);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    inc.addColumn(fam2, qual2, 1);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      final Get g = new Get(row);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      final Result result = region.get(g);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    } catch (Exception e) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * Test multi-threaded increments.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Test<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    boolean fast = true;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // run a with mixed column families (1 and 3 versions)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // same row over two column families.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    int numThreads = 100;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    int incrementsPerThread = 1000;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    int expectedTotal = 0;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    // create all threads<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      expectedTotal += (i * incrementsPerThread);<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>    // run all threads<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      all[i].start();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // wait for all threads to finish<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        all[i].join();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      } catch (InterruptedException e) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        LOG.info("Ignored", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private void assertICV(byte [] row,<a name="line.232"></a>
-<span class="sourceLineNo">233</span>                         byte [] familiy,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>                         byte[] qualifier,<a name="line.234"></a>
-<span class="sourceLineNo">235</span>                         long amount,<a name="line.235"></a>
-<span class="sourceLineNo">236</span>                         boolean fast) throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // run a get and see?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    Get get = new Get(row);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    get.addColumn(familiy, qualifier);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    Result result = region.get(get);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    assertEquals(1, result.size());<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>    Cell kv = result.rawCells()[0];<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    assertEquals(amount, r);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      byte[] ... families)<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    throws IOException {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    byte[] ... families)<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    int i=0;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    for(byte [] family : families) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      htd.addFamily(hcd);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * families on this row.<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public static class Incrementer extends Thread {<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    private final Region region;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    private final int numIncrements;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    private final int amount;<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      super("Incrementer." + threadNumber);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.region = region;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      this.numIncrements = numIncrements;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      this.amount = amount;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      setDaemon(true);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertNotNull;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import static org.junit.Assert.assertTrue;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import static org.junit.Assert.fail;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.ArrayList;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Arrays;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.List;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Objects;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.Random;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.CountDownLatch;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.conf.Configuration;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.fs.FileSystem;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.fs.Path;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.Cell;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.HConstants;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.MultithreadedTestUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestContext;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.MultithreadedTestUtil.TestThread;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.TableName;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Append;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Get;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.IsolationLevel;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Mutation;<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.RegionInfo;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Result;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.HeapSize;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.After;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.junit.Before;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.junit.ClassRule;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.junit.Rule;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.junit.Test;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.junit.experimental.categories.Category;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.junit.rules.TestName;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.slf4j.Logger;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.slf4j.LoggerFactory;<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> * Testing of HRegion.incrementColumnValue, HRegion.increment,<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * and HRegion.append<a name="line.84"></a>
+<span class="sourceLineNo">085</span> */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>@Category({VerySlowRegionServerTests.class, MediumTests.class}) // Starts 100 threads<a name="line.86"></a>
+<span class="sourceLineNo">087</span>public class TestAtomicOperation {<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  @ClassRule<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      HBaseClassTestRule.forClass(TestAtomicOperation.class);<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicOperation.class);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @Rule public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  HRegion region = null;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  private HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Test names<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  static  byte[] tableName;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  static final byte[] qual1 = Bytes.toBytes("qual1");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  static final byte[] qual2 = Bytes.toBytes("qual2");<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  static final byte[] qual3 = Bytes.toBytes("qual3");<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  static final byte[] value1 = Bytes.toBytes("value1");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  static final byte[] value2 = Bytes.toBytes("value2");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  static final byte [] row = Bytes.toBytes("rowA");<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  static final byte [] row2 = Bytes.toBytes("rowB");<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  public void setup() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    tableName = Bytes.toBytes(name.getMethodName());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @After<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void teardown() throws IOException {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (region != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      BlockCache bc = region.getStores().get(0).getCacheConfig().getBlockCache();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      region.close();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      WAL wal = region.getWAL();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      if (wal != null) wal.close();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (bc != null) bc.shutdown();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      region = null;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  // New tests that doesn't spin up a mini cluster but rather just test the<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  // individual code pieces in the HRegion.<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  /**<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Test basic append operation.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * More tests in<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @see org.apache.hadoop.hbase.client.TestFromClientSide#testAppend()<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  @Test<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public void testAppend() throws IOException {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    String v1 = "Ultimate Answer to the Ultimate Question of Life,"+<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    " The Universe, and Everything";<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    String v2 = " is... 42.";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    Append a = new Append(row);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    a.setReturnResults(false);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v2));<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    assertTrue(region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE).isEmpty());<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    a = new Append(row);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1+v2), result.getValue(fam1, qual1)));<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2)));<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  @Test<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public void testAppendWithMultipleFamilies() throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    final byte[] fam3 = Bytes.toBytes("colfamily31");<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    initHRegion(tableName, name.getMethodName(), fam1, fam2, fam3);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String v1 = "Appended";<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    String v2 = "Value";<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Append a = new Append(row);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    a.setReturnResults(false);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v2));<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    assertTrue("Expected an empty result but result contains " + result.size() + " keys",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      result.isEmpty());<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    a = new Append(row);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v2));<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    a.addColumn(fam3, qual3, Bytes.toBytes(v2));<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    a.addColumn(fam1, qual2, Bytes.toBytes(v1));<a name="line.173"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>    result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>    byte[] actualValue1 = result.getValue(fam1, qual1);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    byte[] actualValue2 = result.getValue(fam2, qual2);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    byte[] actualValue3 = result.getValue(fam3, qual3);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    byte[] actualValue4 = result.getValue(fam1, qual2);<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>    assertNotNull("Value1 should bot be null", actualValue1);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    assertNotNull("Value2 should bot be null", actualValue2);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    assertNotNull("Value3 should bot be null", actualValue3);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertNotNull("Value4 should bot be null", actualValue4);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1 + v2), actualValue1));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2 + v1), actualValue2));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2), actualValue3));<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), actualValue4));<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>  @Test<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public void testAppendWithNonExistingFamily() throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final String v1 = "Value";<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    final Append a = new Append(row);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    a.addColumn(fam1, qual1, Bytes.toBytes(v1));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    a.addColumn(fam2, qual2, Bytes.toBytes(v1));<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Result result = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      assertEquals(null, result);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } catch (Exception e) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      fail("Append operation should fail with NoSuchColumnFamilyException.");<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Test<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void testIncrementWithNonExistingFamily() throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    final Increment inc = new Increment(row);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    inc.addColumn(fam1, qual1, 1);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    inc.addColumn(fam2, qual2, 1);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    inc.setDurability(Durability.ASYNC_WAL);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      final Get g = new Get(row);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      final Result result = region.get(g);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      assertEquals(null, result.getValue(fam1, qual1));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      assertEquals(null, result.getValue(fam2, qual2));<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    } catch (Exception e) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      fail("Increment operation should fail with NoSuchColumnFamilyException.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * Test multi-threaded increments.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Test<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void testIncrementMultiThreads() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    boolean fast = true;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    LOG.info("Starting test testIncrementMultiThreads");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    // run a with mixed column families (1 and 3 versions)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Create 100 threads, each will increment by its own quantity. All 100 threads update the<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // same row over two column families.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    int numThreads = 100;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    int incrementsPerThread = 1000;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    Incrementer[] all = new Incrementer[numThreads];<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    int expectedTotal = 0;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    // create all threads<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      all[i] = new Incrementer(region, i, i, incrementsPerThread);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      expectedTotal += (i * incrementsPerThread);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // run all threads<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      all[i].start();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>    // wait for all threads to finish<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        all[i].join();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      } catch (InterruptedException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        LOG.info("Ignored", e);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    assertICV(row, fam1, qual1, expectedTotal, fast);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    assertICV(row, fam1, qual2, expectedTotal*2, fast);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    assertICV(row, fam2, qual3, expectedTotal*3, fast);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    LOG.info("testIncrementMultiThreads successfully verified that total is " + expectedTotal);<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>  private void assertICV(byte [] row,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                         byte [] familiy,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                         byte[] qualifier,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                         long amount,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                         boolean fast) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    // run a get and see?<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    Get get = new Get(row);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    if (fast) get.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    get.addColumn(familiy, qualifier);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Result result = region.get(get);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertEquals(1, result.size());<a name="line.281"></a>
+<span class="sourceLineNo">282</span><a name="line.282"></a>
+<span class="sourceLineNo">283</span>    Cell kv = result.rawCells()[0];<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    long r = Bytes.toLong(CellUtil.cloneValue(kv));<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    assertEquals(amount, r);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>    @Override<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    public void run() {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          Increment inc = new Increment(row);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          inc.addColumn(fam1, qual1, amount);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          Result result = region.increment(inc);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (result != null) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.302"></a>
-<span class="sourceLineNo">303</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>              fam1Increment, fam2Increment);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        } catch (IOException e) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          e.printStackTrace();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        }<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  }<a name="line.316"></a>
+<span class="sourceLineNo">288</span>  private void initHRegion (byte [] tableName, String callingMethod,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      byte[] ... families)<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    initHRegion(tableName, callingMethod, null, families);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  private void initHRegion (byte [] tableName, String callingMethod, int [] maxVersions,<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    byte[] ... families)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    int i=0;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    for(byte [] family : families) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      HColumnDescriptor hcd = new HColumnDescriptor(family);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      hcd.setMaxVersions(maxVersions != null ? maxVersions[i++] : 1);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      htd.addFamily(hcd);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>  /**<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * A thread that makes increment calls always on the same row, this.row against two column<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * families on this row.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static class Incrementer extends Thread {<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    private final Region region;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    private final int numIncrements;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    private final int amount;<a name="line.316"></a>
 <span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>  @Test<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  public void testAppendMultiThreads() throws IOException {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // run a with mixed column families (1 and 3 versions)<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>    int numThreads = 100;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    int opsPerThread = 100;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    final byte[] val = new byte[]{1};<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // create all threads<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      all[i] = new AtomicOperation(region, opsPerThread, null, failures) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        @Override<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        public void run() {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            try {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>              Append a = new Append(row);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              a.addColumn(fam1, qual1, val);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              a.addColumn(fam1, qual2, val);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              a.addColumn(fam2, qual3, val);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              a.setDurability(Durability.ASYNC_WAL);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>              Get g = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>              Result result = region.get(g);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam1, qual2).length);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              assertEquals(result.getValue(fam1, qual1).length, result.getValue(fam2, qual3).length);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            } catch (IOException e) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              e.printStackTrace();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              failures.incrementAndGet();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              fail();<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>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      };<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>    // run all threads<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      all[i].start();<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public Incrementer(Region region, int threadNumber, int amount, int numIncrements) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      super("Incrementer." + threadNumber);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.region = region;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      this.numIncrements = numIncrements;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      this.amount = amount;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      setDaemon(true);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
+<span class="sourceLineNo">326</span><a name="line.326"></a>
+<span class="sourceLineNo">327</span>    @Override<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    public void run() {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      for (int i = 0; i &lt; numIncrements; i++) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          Increment inc = new Increment(row);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>          inc.addColumn(fam1, qual1, amount);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          inc.addColumn(fam1, qual2, amount*2);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>          inc.addColumn(fam2, qual3, amount*3);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          inc.setDurability(Durability.ASYNC_WAL);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          Result result = region.increment(inc);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (result != null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            assertTrue(result.getValue(fam2, qual3) != null);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*3,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>              Bytes.toLong(result.getValue(fam2, qual3)));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            assertEquals(Bytes.toLong(result.getValue(fam1, qual1))*2,<a name="line.343"></a>
+<span class="sourceLineNo">344</span>               Bytes.toLong(result.getValue(fam1, qual2)));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            long fam1Increment = Bytes.toLong(result.getValue(fam1, qual1))*3;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            long fam2Increment = Bytes.toLong(result.getValue(fam2, qual3));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            assertEquals("fam1=" + fam1Increment + ", fam2=" + fam2Increment,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>              fam1Increment, fam2Increment);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>          }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        } catch (IOException e) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>          e.printStackTrace();<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>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  @Test<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public void testAppendMultiThreads() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    LOG.info("Starting test testAppendMultiThreads");<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    // run a with mixed column families (1 and 3 versions)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    initHRegion(tableName, name.getMethodName(), new int[] {1,3}, fam1, fam2);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    // wait for all threads to finish<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      try {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        all[i].join();<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      } catch (InterruptedException e) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    assertEquals(0, failures.get());<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    Get g = new Get(row);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    Result result = region.get(g);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    assertEquals(10000, result.getValue(fam1, qual1).length);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    assertEquals(10000, result.getValue(fam1, qual2).length);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    assertEquals(10000, result.getValue(fam2, qual3).length);<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Test multi-threaded row mutations.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void testRowMutationMultiThreads() throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    LOG.info("Starting test testRowMutationMultiThreads");<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>    // create 10 threads, each will alternate between adding and<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // removing a column<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    int numThreads = 10;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    int opsPerThread = 250;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // create all threads<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        public void run() {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          boolean op = true;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>            try {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>              // throw in some flushes<a name="line.401"></a>
-<span class="sourceLineNo">402</span>              if (i%10==0) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                synchronized(region) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                  LOG.debug("flushing");<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                  region.flush(true);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>                  if (i%100==0) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>                    region.compact(false);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>                  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>                }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>              }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>              long ts = timeStamps.incrementAndGet();<a name="line.411"></a>
-<span class="sourceLineNo">412</span>              RowMutations rm = new RowMutations(row);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>              if (op) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>                Put p = new Put(row, ts);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>                p.addColumn(fam1, qual1, value1);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                rm.add(p);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                Delete d = new Delete(row);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                d.addColumns(fam1, qual2, ts);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                rm.add(d);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>              } else {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                Delete d = new Delete(row);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>                d.addColumns(fam1, qual1, ts);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>                rm.add(d);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>                Put p = new Put(row, ts);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>                p.addColumn(fam1, qual2, value2);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.429"></a>
-<span class="sourceLineNo">430</span>                rm.add(p);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>              }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>              region.mutateRow(rm);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>              op ^= true;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>              // check: should always see exactly one column<a name="line.434"></a>
-<span class="sourceLineNo">435</span>              Get g = new Get(row);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>              Result r = region.get(g);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>              if (r.size() != 1) {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>                LOG.debug(Objects.toString(r));<a name="line.438"></a>
-<span class="sourceLineNo">439</span>                failures.incrementAndGet();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>                fail();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>              }<a name="line.441"></a>
-<span class="sourceLineNo">442</span>            } catch (IOException e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              e.printStackTrace();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>              failures.incrementAndGet();<a name="line.444"></a>
-<span class="sourceLineNo">445</span>              fail();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          }<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      };<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    }<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    // run all threads<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      all[i].start();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    // wait for all threads to finish<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        all[i].join();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      } catch (InterruptedException e) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    assertEquals(0, failures.get());<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>   * Test multi-threaded region mutations.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  @Test<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public void testMultiRowMutationMultiThreads() throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    LOG.info("Starting test testMultiRowMutationMultiThreads");<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    initHRegion(tableName, name.getMethodName(), fam1);<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>    // create 10 threads, each will alternate between adding and<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    // removing a column<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int numThreads = 10;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    int opsPerThread = 250;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    AtomicOperation[] all = new AtomicOperation[numThreads];<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>    AtomicLong timeStamps = new AtomicLong(0);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    AtomicInteger failures = new AtomicInteger(0);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    final List&lt;byte[]&gt; rowsToLock = Arrays.asList(row, row2);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // create all threads<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      all[i] = new AtomicOperation(region, opsPerThread, timeStamps, failures) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        @Override<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        public void run() {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          boolean op = true;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>          for (int i=0; i&lt;numOps; i++) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>            try {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>              // throw in some flushes<a name="line.494"></a>
-<span class="sourceLineNo">495</span>              if (i%10==0) {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>                synchronized(region) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>                  LOG.debug("flushing");<a name="line.497"></a>
-<span class="sourceLineNo">498</span>                  region.flush(true);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>                  if (i%100==0) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                    region.compact(false);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                  }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>                }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>              }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>              long ts = timeStamps.incrementAndGet();<a name="line.504"></a>
-<span class="sourceLineNo">505</span>              List&lt;Mutation&gt; mrm = new ArrayList&lt;&gt;();<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              if (op) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>                Put p = new Put(row2, ts);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                p.addColumn(fam1, qual1, value1);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>                mrm.add(p);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                Delete d = new Delete(row);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>                d.addColumns(fam1, qual1, ts);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>                mrm.add(d);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>              } else {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>                Delete d = new Delete(row2);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>                d.addColumns(fam1, qual1, ts);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>                d.setDurability(Durability.ASYNC_WAL);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>                mrm.add(d);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>                Put p = new Put(row, ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>                p.setDurability(Durability.ASYNC_WAL);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>                p.addColumn(fam1, qual1, value2);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>                mrm.add(p);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>              }<a name="line.524"></a>
-<span class="sourceLineNo">525</span>              region.mutateRowsWithLocks(mrm, rowsToLock, HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>              op ^= true;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>              // check: should always see exactly one column<a name="line.527"></a>
-<span class="sourceLineNo">528</span>              Scan s = new Scan(row);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>              RegionScanner rs = region.getScanner(s);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>              List&lt;Cell&gt; r = new ArrayList&lt;&gt;();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>              while (rs.next(r))<a name="line.531"></a>
-<span class="sourceLineNo">532</span>                ;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>              rs.close();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              if (r.size() != 1) {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>                LOG.debug(Objects.toString(r));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>                failures.incrementAndGet();<a name="line.536"></a>
-<span class="sourceLineNo">537</span>                fail();<a name="line.537"></a>
-<span class="sourceLineNo">538</span>              }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>            } catch (IOException e) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              e.printStackTrace();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>              failures.incrementAndGet();<a name="line.541"></a>
-<span class="sourceLineNo">542</span>              fail();<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          }<a name="line.544"></a>
-<span class="sourceLineNo">545</span>        }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      };<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>    // run all threads<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      all[i].start();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // wait for all threads to finish<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    for (int i = 0; i &lt; numThreads; i++) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      try {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        all[i].join();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      } catch (InterruptedException e) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      }<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    }<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    assertEquals(0, failures.get());<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>  public static class AtomicOperation extends Thread {<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    protected final HRegion region;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    protected final int numOps;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    protected final AtomicLong timeStamps;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    protected final AtomicInteger failures;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    protected final Random r = new Random();<a name="line.569"></a>
-<span class="sourceLineNo">570</span><a name="line.570"></a>
-<span class="sourceLineNo">571</span>    public AtomicOperation(HRegion region, int numOps, AtomicLong timeStamps,<a name="line.571"></a>
-<span class="sourceLineNo">572</span>        AtomicInteger failures) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.region = region;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.numOps = numOps;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.timeStamps = timeStamps;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.failures = failures;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    }<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>  private static CountDownLatch latch = new CountDownLatch(1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  private enum TestStep {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    INIT,                  // initial put of 10 to set value of the cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    PUT_STARTED,           // began doing a put of 50 to cell<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    PUT_COMPLETED,         // put complete (released RowLock, but may not have advanced MVCC).<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    CHECKANDPUT_STARTED,   // began checkAndPut: if 10 -&gt; 11<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    CHECKANDPUT_COMPLETED  // completed checkAndPut<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    // NOTE: at the end of these steps, the value of the cell should be 50, not 11!<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  private static volatile TestStep testStep = TestStep.INIT;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  private final String family = "f1";<a

<TRUNCATED>

[38/49] hbase-site git commit: Published site at 3810ba2c6edfc531181ffc9e6c68396a0c2d2027.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/705d69c4/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
index a6e1a7b..768cf5d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
@@ -284,11 +284,11 @@
 <span class="sourceLineNo">276</span>   */<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  void resetTempDir() throws IOException {<a name="line.277"></a>
 <span class="sourceLineNo">278</span>    // cleanup any existing snapshots.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    Path tmpdir = SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    if (master.getMasterFileSystem().getFileSystem().exists(tmpdir)) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      if (!master.getMasterFileSystem().getFileSystem().delete(tmpdir, true)) {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        LOG.warn("Couldn't delete working snapshot directory: " + tmpdir);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      }<a name="line.283"></a>
+<span class="sourceLineNo">279</span>    Path tmpdir = SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir,<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        master.getConfiguration());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    FileSystem tmpFs = tmpdir.getFileSystem(master.getConfiguration());<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    if (!tmpFs.delete(tmpdir, true)) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      LOG.warn("Couldn't delete working snapshot directory: " + tmpdir);<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><a name="line.286"></a>
@@ -441,8 +441,8 @@
 <span class="sourceLineNo">433</span>   */<a name="line.433"></a>
 <span class="sourceLineNo">434</span>  private synchronized void prepareToTakeSnapshot(SnapshotDescription snapshot)<a name="line.434"></a>
 <span class="sourceLineNo">435</span>      throws HBaseSnapshotException {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir);<a name="line.437"></a>
+<span class="sourceLineNo">436</span>    Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir,<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        master.getConfiguration());<a name="line.437"></a>
 <span class="sourceLineNo">438</span>    TableName snapshotTable =<a name="line.438"></a>
 <span class="sourceLineNo">439</span>        TableName.valueOf(snapshot.getTable());<a name="line.439"></a>
 <span class="sourceLineNo">440</span><a name="line.440"></a>
@@ -465,15 +465,15 @@
 <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>    try {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // delete the working directory, since we aren't running the snapshot. Likely leftovers<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // from a failed attempt.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      fs.delete(workingDir, true);<a name="line.462"></a>
-<span class="sourceLineNo">463</span><a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // recreate the working directory for the snapshot<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      if (!fs.mkdirs(workingDir)) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        throw new SnapshotCreationException(<a name="line.466"></a>
-<span class="sourceLineNo">467</span>            "Couldn't create working directory (" + workingDir + ") for snapshot",<a name="line.467"></a>
-<span class="sourceLineNo">468</span>            ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.468"></a>
+<span class="sourceLineNo">460</span>      FileSystem workingDirFS = workingDir.getFileSystem(master.getConfiguration());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      // delete the working directory, since we aren't running the snapshot. Likely leftovers<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // from a failed attempt.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      workingDirFS.delete(workingDir, true);<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // recreate the working directory for the snapshot<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (!workingDirFS.mkdirs(workingDir)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        throw new SnapshotCreationException("Couldn't create working directory (" + workingDir<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            + ") for snapshot" , ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.468"></a>
 <span class="sourceLineNo">469</span>      }<a name="line.469"></a>
 <span class="sourceLineNo">470</span>    } catch (HBaseSnapshotException e) {<a name="line.470"></a>
 <span class="sourceLineNo">471</span>      throw e;<a name="line.471"></a>
@@ -487,718 +487,722 @@
 <span class="sourceLineNo">479</span>  /**<a name="line.479"></a>
 <span class="sourceLineNo">480</span>   * Take a snapshot of a disabled table.<a name="line.480"></a>
 <span class="sourceLineNo">481</span>   * @param snapshot description of the snapshot to take. Modified to be {@link Type#DISABLED}.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * @throws HBaseSnapshotException if the snapshot could not be started<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   */<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  private synchronized void snapshotDisabledTable(SnapshotDescription snapshot)<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      throws HBaseSnapshotException {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // setup the snapshot<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    prepareToTakeSnapshot(snapshot);<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // set the snapshot to be a disabled snapshot, since the client doesn't know about that<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    snapshot = snapshot.toBuilder().setType(Type.DISABLED).build();<a name="line.490"></a>
-<span class="sourceLineNo">491</span><a name="line.491"></a>
-<span class="sourceLineNo">492</span>    // Take the snapshot of the disabled table<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    DisabledTableSnapshotHandler handler =<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        new DisabledTableSnapshotHandler(snapshot, master, this);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    snapshotTable(snapshot, handler);<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>   * Take a snapshot of an enabled table.<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param snapshot description of the snapshot to take.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @throws HBaseSnapshotException if the snapshot could not be started<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  private synchronized void snapshotEnabledTable(SnapshotDescription snapshot)<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      throws HBaseSnapshotException {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    // setup the snapshot<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    prepareToTakeSnapshot(snapshot);<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>    // Take the snapshot of the enabled table<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    EnabledTableSnapshotHandler handler =<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        new EnabledTableSnapshotHandler(snapshot, master, this);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    snapshotTable(snapshot, handler);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  /**<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * Take a snapshot using the specified handler.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * On failure the snapshot temporary working directory is removed.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * NOTE: prepareToTakeSnapshot() called before this one takes care of the rejecting the<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   *       snapshot request if the table is busy with another snapshot/restore operation.<a name="line.518"></a>
-<span class="sourceLineNo">519</span>   * @param snapshot the snapshot description<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @param handler the snapshot handler<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   */<a name="line.521"></a>
-<span class="sourceLineNo">522</span>  private synchronized void snapshotTable(SnapshotDescription snapshot,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      final TakeSnapshotHandler handler) throws HBaseSnapshotException {<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    try {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      handler.prepare();<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      this.executorService.submit(handler);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      this.snapshotHandlers.put(TableName.valueOf(snapshot.getTable()), handler);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    } catch (Exception e) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      // cleanup the working directory by trying to delete it from the fs.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      try {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        if (!this.master.getMasterFileSystem().getFileSystem().delete(workingDir, true)) {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          LOG.error("Couldn't delete working directory (" + workingDir + " for snapshot:" +<a name="line.533"></a>
-<span class="sourceLineNo">534</span>              ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.534"></a>
-<span class="sourceLineNo">535</span>        }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      } catch (IOException e1) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>        LOG.error("Couldn't delete working directory (" + workingDir + " for snapshot:" +<a name="line.537"></a>
-<span class="sourceLineNo">538</span>            ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      }<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // fail the snapshot<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      throw new SnapshotCreationException("Could not build snapshot handler", e,<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /**<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Take a snapshot based on the enabled/disabled state of the table.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   *<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param snapshot<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @throws HBaseSnapshotException when a snapshot specific exception occurs.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException when some sort of generic IO exception occurs.<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  public void takeSnapshot(SnapshotDescription snapshot) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // check to see if we already completed the snapshot<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    if (isSnapshotCompleted(snapshot)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      throw new SnapshotExistsException(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>          "Snapshot '" + snapshot.getName() + "' already stored on the filesystem.",<a name="line.557"></a>
-<span class="sourceLineNo">558</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
-<span class="sourceLineNo">560</span><a name="line.560"></a>
-<span class="sourceLineNo">561</span>    LOG.debug("No existing snapshot, attempting snapshot...");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    // stop tracking "abandoned" handlers<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    cleanupSentinels();<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    // check to see if the table exists<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    TableDescriptor desc = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      desc = master.getTableDescriptors().get(<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          TableName.valueOf(snapshot.getTable()));<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    } catch (FileNotFoundException e) {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      String msg = "Table:" + snapshot.getTable() + " info doesn't exist!";<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      LOG.error(msg);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throw new SnapshotCreationException(msg, e, ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    } catch (IOException e) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      throw new SnapshotCreationException(<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          "Error while geting table description for table " + snapshot.getTable(), e,<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    if (desc == null) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      throw new SnapshotCreationException(<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          "Table '" + snapshot.getTable() + "' doesn't exist, can't take snapshot.",<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    SnapshotDescription.Builder builder = snapshot.toBuilder();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    // if not specified, set the snapshot format<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    if (!snapshot.hasVersion()) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      builder.setVersion(SnapshotDescriptionUtils.SNAPSHOT_LAYOUT_VERSION);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    RpcServer.getRequestUser().ifPresent(user -&gt; {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      if (User.isHBaseSecurityEnabled(master.getConfiguration())) {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        builder.setOwner(user.getShortName());<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      }<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    });<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    snapshot = builder.build();<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>    // call pre coproc hook<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    if (cpHost != null) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      cpHost.preSnapshot(snapshotPOJO, desc);<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>    // if the table is enabled, then have the RS run actually the snapshot work<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    TableName snapshotTable = TableName.valueOf(snapshot.getTable());<a name="line.606"></a>
-<span class="sourceLineNo">607</span>    if (master.getTableStateManager().isTableState(snapshotTable,<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        TableState.State.ENABLED)) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      LOG.debug("Table enabled, starting distributed snapshot.");<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      snapshotEnabledTable(snapshot);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      LOG.debug("Started snapshot: " + ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    // For disabled table, snapshot is created by the master<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    else if (master.getTableStateManager().isTableState(snapshotTable,<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        TableState.State.DISABLED)) {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>      LOG.debug("Table is disabled, running snapshot entirely on master.");<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      snapshotDisabledTable(snapshot);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      LOG.debug("Started snapshot: " + ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    } else {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      LOG.error("Can't snapshot table '" + snapshot.getTable()<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          + "', isn't open or closed, we don't know what to do!");<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      TablePartiallyOpenException tpoe = new TablePartiallyOpenException(snapshot.getTable()<a name="line.622"></a>
-<span class="sourceLineNo">623</span>          + " isn't fully open.");<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      throw new SnapshotCreationException("Table is not entirely open or closed", tpoe,<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    }<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    // call post coproc hook<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    if (cpHost != null) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      cpHost.postSnapshot(snapshotPOJO, desc);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    }<a name="line.631"></a>
-<span class="sourceLineNo">632</span>  }<a name="line.632"></a>
-<span class="sourceLineNo">633</span><a name="line.633"></a>
-<span class="sourceLineNo">634</span>  /**<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * Set the handler for the current snapshot<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * &lt;p&gt;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * Exposed for TESTING<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @param tableName<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   * @param handler handler the master should use<a name="line.639"></a>
-<span class="sourceLineNo">640</span>   *<a name="line.640"></a>
-<span class="sourceLineNo">641</span>   * TODO get rid of this if possible, repackaging, modify tests.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>   */<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  public synchronized void setSnapshotHandlerForTesting(<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      final TableName tableName,<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      final SnapshotSentinel handler) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    if (handler != null) {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      this.snapshotHandlers.put(tableName, handler);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      this.snapshotHandlers.remove(tableName);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    }<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  }<a name="line.651"></a>
-<span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>  /**<a name="line.653"></a>
-<span class="sourceLineNo">654</span>   * @return distributed commit coordinator for all running snapshots<a name="line.654"></a>
-<span class="sourceLineNo">655</span>   */<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  ProcedureCoordinator getCoordinator() {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    return coordinator;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  }<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  /**<a name="line.660"></a>
-<span class="sourceLineNo">661</span>   * Check to see if the snapshot is one of the currently completed snapshots<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Returns true if the snapshot exists in the "completed snapshots folder".<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   *<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * @param snapshot expected snapshot to check<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the snapshot is stored on the {@link FileSystem}, &lt;tt&gt;false&lt;/tt&gt; if is<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   *         not stored<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @throws IOException if the filesystem throws an unexpected exception,<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @throws IllegalArgumentException if snapshot name is invalid.<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   */<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private boolean isSnapshotCompleted(SnapshotDescription snapshot) throws IOException {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      final Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, rootDir);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      // check to see if the snapshot already exists<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      return fs.exists(snapshotDir);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    } catch (IllegalArgumentException iae) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      throw new UnknownSnapshotException("Unexpected exception thrown", iae);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  }<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>  /**<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * Clone the specified snapshot.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * The clone will fail if the destination table has a snapshot or restore in progress.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param reqSnapshot Snapshot Descriptor from request<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * @param tableName table to clone<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param snapshot Snapshot Descriptor<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * @param snapshotTableDesc Table Descriptor<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * @return procId the ID of the clone snapshot procedure<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * @throws IOException<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   */<a name="line.692"></a>
-<span class="sourceLineNo">693</span>  private long cloneSnapshot(final SnapshotDescription reqSnapshot, final TableName tableName,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      final SnapshotDescription snapshot, final TableDescriptor snapshotTableDesc,<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      final NonceKey nonceKey, final boolean restoreAcl) throws IOException {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    TableDescriptor htd = TableDescriptorBuilder.copy(tableName, snapshotTableDesc);<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    if (cpHost != null) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.700"></a>
-<span class="sourceLineNo">701</span>      cpHost.preCloneSnapshot(snapshotPOJO, htd);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    long procId;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    try {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      procId = cloneSnapshot(snapshot, htd, nonceKey, restoreAcl);<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    } catch (IOException e) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      LOG.error("Exception occurred while cloning the snapshot " + snapshot.getName()<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        + " as table " + tableName.getNameAsString(), e);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      throw e;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    }<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    LOG.info("Clone snapshot=" + snapshot.getName() + " as table=" + tableName);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    if (cpHost != null) {<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      cpHost.postCloneSnapshot(snapshotPOJO, htd);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    }<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    return procId;<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>  /**<a name="line.719"></a>
-<span class="sourceLineNo">720</span>   * Clone the specified snapshot into a new table.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>   * The operation will fail if the destination table has a snapshot or restore in progress.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   *<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   * @param snapshot Snapshot Descriptor<a name="line.723"></a>
-<span class="sourceLineNo">724</span>   * @param tableDescriptor Table Descriptor of the table to create<a name="line.724"></a>
-<span class="sourceLineNo">725</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.725"></a>
-<span class="sourceLineNo">726</span>   * @return procId the ID of the clone snapshot procedure<a name="line.726"></a>
-<span class="sourceLineNo">727</span>   */<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  synchronized long cloneSnapshot(final SnapshotDescription snapshot,<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      final TableDescriptor tableDescriptor, final NonceKey nonceKey, final boolean restoreAcl)<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      throws HBaseSnapshotException {<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    TableName tableName = tableDescriptor.getTableName();<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>    // make sure we aren't running a snapshot on the same table<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    if (isTakingSnapshot(tableName)) {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      throw new RestoreSnapshotException("Snapshot in progress on the restore table=" + tableName);<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>    // make sure we aren't running a restore on the same table<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    if (isRestoringTable(tableName)) {<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      throw new RestoreSnapshotException("Restore already in progress on the table=" + tableName);<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>    try {<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      long procId = master.getMasterProcedureExecutor().submitProcedure(<a name="line.744"></a>
-<span class="sourceLineNo">745</span>        new CloneSnapshotProcedure(master.getMasterProcedureExecutor().getEnvironment(),<a name="line.745"></a>
-<span class="sourceLineNo">746</span>                tableDescriptor, snapshot, restoreAcl),<a name="line.746"></a>
-<span class="sourceLineNo">747</span>        nonceKey);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.restoreTableToProcIdMap.put(tableName, procId);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return procId;<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } catch (Exception e) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      String msg = "Couldn't clone the snapshot="<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        + ClientSnapshotDescriptionUtils.toString(snapshot) + " on table=" + tableName;<a name="line.752"></a>
-<span class="sourceLineNo">753</span>      LOG.error(msg, e);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      throw new RestoreSnapshotException(msg, e);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  }<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>  /**<a name="line.758"></a>
-<span class="sourceLineNo">759</span>   * Restore or Clone the specified snapshot<a name="line.759"></a>
-<span class="sourceLineNo">760</span>   * @param reqSnapshot<a name="line.760"></a>
-<span class="sourceLineNo">761</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.761"></a>
-<span class="sourceLineNo">762</span>   * @throws IOException<a name="line.762"></a>
-<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  public long restoreOrCloneSnapshot(final SnapshotDescription reqSnapshot, final NonceKey nonceKey,<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      final boolean restoreAcl) throws IOException {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir);<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>    // check if the snapshot exists<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    if (!fs.exists(snapshotDir)) {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist.");<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      throw new SnapshotDoesNotExistException(<a name="line.772"></a>
-<span class="sourceLineNo">773</span>        ProtobufUtil.createSnapshotDesc(reqSnapshot));<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>    // Get snapshot info from file system. The reqSnapshot is a "fake" snapshotInfo with<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    // just the snapshot "name" and table name to restore. It does not contains the "real" snapshot<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    // information.<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    SnapshotDescription snapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    SnapshotManifest manifest = SnapshotManifest.open(master.getConfiguration(), fs,<a name="line.780"></a>
-<span class="sourceLineNo">781</span>        snapshotDir, snapshot);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    TableDescriptor snapshotTableDesc = manifest.getTableDescriptor();<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    TableName tableName = TableName.valueOf(reqSnapshot.getTable());<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    // stop tracking "abandoned" handlers<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    cleanupSentinels();<a name="line.786"></a>
-<span class="sourceLineNo">787</span><a name="line.787"></a>
-<span class="sourceLineNo">788</span>    // Verify snapshot validity<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    SnapshotReferenceUtil.verifySnapshot(master.getConfiguration(), fs, manifest);<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>    // Execute the restore/clone operation<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    long procId;<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    if (MetaTableAccessor.tableExists(master.getConnection(), tableName)) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      procId = restoreSnapshot(reqSnapshot, tableName, snapshot, snapshotTableDesc, nonceKey,<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        restoreAcl);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    } else {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      procId =<a name="line.797"></a>
-<span class="sourceLineNo">798</span>          cloneSnapshot(reqSnapshot, tableName, snapshot, snapshotTableDesc, nonceKey, restoreAcl);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    }<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    return procId;<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  /**<a name="line.803"></a>
-<span class="sourceLineNo">804</span>   * Restore the specified snapshot. The restore will fail if the destination table has a snapshot<a name="line.804"></a>
-<span class="sourceLineNo">805</span>   * or restore in progress.<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * @param reqSnapshot Snapshot Descriptor from request<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   * @param tableName table to restore<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   * @param snapshot Snapshot Descriptor<a name="line.808"></a>
-<span class="sourceLineNo">809</span>   * @param snapshotTableDesc Table Descriptor<a name="line.809"></a>
-<span class="sourceLineNo">810</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.810"></a>
-<span class="sourceLineNo">811</span>   * @param restoreAcl true to restore acl of snapshot<a name="line.811"></a>
-<span class="sourceLineNo">812</span>   * @return procId the ID of the restore snapshot procedure<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   * @throws IOException<a name="line.813"></a>
-<span class="sourceLineNo">814</span>   */<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  private long restoreSnapshot(final SnapshotDescription reqSnapshot, final TableName tableName,<a name="line.815"></a>
-<span class="sourceLineNo">816</span>      final SnapshotDescription snapshot, final TableDescriptor snapshotTableDesc,<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      final NonceKey nonceKey, final boolean restoreAcl) throws IOException {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>    if (master.getTableStateManager().isTableState(<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      TableName.valueOf(snapshot.getTable()), TableState.State.ENABLED)) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      throw new UnsupportedOperationException("Table '" +<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        TableName.valueOf(snapshot.getTable()) + "' must be disabled in order to " +<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        "perform a restore operation.");<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>    // call Coprocessor pre hook<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.828"></a>
-<span class="sourceLineNo">829</span>    if (cpHost != null) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      cpHost.preRestoreSnapshot(snapshotPOJO, snapshotTableDesc);<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>    long procId;<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    try {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      procId = restoreSnapshot(snapshot, snapshotTableDesc, nonceKey, restoreAcl);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    } catch (IOException e) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>      LOG.error("Exception occurred while restoring the snapshot " + snapshot.getName()<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        + " as table " + tableName.getNameAsString(), e);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      throw e;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    }<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    LOG.info("Restore snapshot=" + snapshot.getName() + " as table=" + tableName);<a name="line.842"></a>
-<span class="sourceLineNo">843</span><a name="line.843"></a>
-<span class="sourceLineNo">844</span>    if (cpHost != null) {<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      cpHost.postRestoreSnapshot(snapshotPOJO, snapshotTableDesc);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
+<span class="sourceLineNo">482</span>   * @throws IOException if the snapshot could not be started or filesystem for snapshot<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   *         temporary directory could not be determined<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  private synchronized void snapshotDisabledTable(SnapshotDescription snapshot)<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      throws IOException {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // setup the snapshot<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    prepareToTakeSnapshot(snapshot);<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // set the snapshot to be a disabled snapshot, since the client doesn't know about that<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    snapshot = snapshot.toBuilder().setType(Type.DISABLED).build();<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    // Take the snapshot of the disabled table<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    DisabledTableSnapshotHandler handler =<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        new DisabledTableSnapshotHandler(snapshot, master, this);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    snapshotTable(snapshot, handler);<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>  /**<a name="line.499"></a>
+<span class="sourceLineNo">500</span>   * Take a snapshot of an enabled table.<a name="line.500"></a>
+<span class="sourceLineNo">501</span>   * @param snapshot description of the snapshot to take.<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * @throws IOException if the snapshot could not be started or filesystem for snapshot<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   *         temporary directory could not be determined<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
+<span class="sourceLineNo">505</span>  private synchronized void snapshotEnabledTable(SnapshotDescription snapshot)<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          throws IOException {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    // setup the snapshot<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    prepareToTakeSnapshot(snapshot);<a name="line.508"></a>
+<span class="sourceLineNo">509</span><a name="line.509"></a>
+<span class="sourceLineNo">510</span>    // Take the snapshot of the enabled table<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    EnabledTableSnapshotHandler handler =<a name="line.511"></a>
+<span class="sourceLineNo">512</span>        new EnabledTableSnapshotHandler(snapshot, master, this);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    snapshotTable(snapshot, handler);<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>   * Take a snapshot using the specified handler.<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   * On failure the snapshot temporary working directory is removed.<a name="line.518"></a>
+<span class="sourceLineNo">519</span>   * NOTE: prepareToTakeSnapshot() called before this one takes care of the rejecting the<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   *       snapshot request if the table is busy with another snapshot/restore operation.<a name="line.520"></a>
+<span class="sourceLineNo">521</span>   * @param snapshot the snapshot description<a name="line.521"></a>
+<span class="sourceLineNo">522</span>   * @param handler the snapshot handler<a name="line.522"></a>
+<span class="sourceLineNo">523</span>   */<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  private synchronized void snapshotTable(SnapshotDescription snapshot,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      final TakeSnapshotHandler handler) throws IOException {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    try {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      handler.prepare();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      this.executorService.submit(handler);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      this.snapshotHandlers.put(TableName.valueOf(snapshot.getTable()), handler);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    } catch (Exception e) {<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      // cleanup the working directory by trying to delete it from the fs.<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      Path workingDir = SnapshotDescriptionUtils.getWorkingSnapshotDir(snapshot, rootDir,<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          master.getConfiguration());<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      FileSystem workingDirFs = workingDir.getFileSystem(master.getConfiguration());<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      try {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>        if (!workingDirFs.delete(workingDir, true)) {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          LOG.error("Couldn't delete working directory (" + workingDir + " for snapshot:" +<a name="line.537"></a>
+<span class="sourceLineNo">538</span>              ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      } catch (IOException e1) {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>        LOG.error("Couldn't delete working directory (" + workingDir + " for snapshot:" +<a name="line.541"></a>
+<span class="sourceLineNo">542</span>            ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      }<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      // fail the snapshot<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      throw new SnapshotCreationException("Could not build snapshot handler", e,<a name="line.545"></a>
+<span class="sourceLineNo">546</span>        ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>  /**<a name="line.550"></a>
+<span class="sourceLineNo">551</span>   * Take a snapshot based on the enabled/disabled state of the table.<a name="line.551"></a>
+<span class="sourceLineNo">552</span>   *<a name="line.552"></a>
+<span class="sourceLineNo">553</span>   * @param snapshot<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * @throws HBaseSnapshotException when a snapshot specific exception occurs.<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   * @throws IOException when some sort of generic IO exception occurs.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>   */<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  public void takeSnapshot(SnapshotDescription snapshot) throws IOException {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    // check to see if we already completed the snapshot<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    if (isSnapshotCompleted(snapshot)) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throw new SnapshotExistsException(<a name="line.560"></a>
+<span class="sourceLineNo">561</span>          "Snapshot '" + snapshot.getName() + "' already stored on the filesystem.",<a name="line.561"></a>
+<span class="sourceLineNo">562</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>    LOG.debug("No existing snapshot, attempting snapshot...");<a name="line.565"></a>
+<span class="sourceLineNo">566</span><a name="line.566"></a>
+<span class="sourceLineNo">567</span>    // stop tracking "abandoned" handlers<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    cleanupSentinels();<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>    // check to see if the table exists<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    TableDescriptor desc = null;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      desc = master.getTableDescriptors().get(<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          TableName.valueOf(snapshot.getTable()));<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    } catch (FileNotFoundException e) {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      String msg = "Table:" + snapshot.getTable() + " info doesn't exist!";<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      LOG.error(msg);<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      throw new SnapshotCreationException(msg, e, ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    } catch (IOException e) {<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      throw new SnapshotCreationException(<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          "Error while geting table description for table " + snapshot.getTable(), e,<a name="line.581"></a>
+<span class="sourceLineNo">582</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    if (desc == null) {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      throw new SnapshotCreationException(<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          "Table '" + snapshot.getTable() + "' doesn't exist, can't take snapshot.",<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    SnapshotDescription.Builder builder = snapshot.toBuilder();<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    // if not specified, set the snapshot format<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    if (!snapshot.hasVersion()) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      builder.setVersion(SnapshotDescriptionUtils.SNAPSHOT_LAYOUT_VERSION);<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    }<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    RpcServer.getRequestUser().ifPresent(user -&gt; {<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      if (User.isHBaseSecurityEnabled(master.getConfiguration())) {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        builder.setOwner(user.getShortName());<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      }<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    });<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    snapshot = builder.build();<a name="line.599"></a>
+<span class="sourceLineNo">600</span><a name="line.600"></a>
+<span class="sourceLineNo">601</span>    // call pre coproc hook<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    if (cpHost != null) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      cpHost.preSnapshot(snapshotPOJO, desc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    }<a name="line.607"></a>
+<span class="sourceLineNo">608</span><a name="line.608"></a>
+<span class="sourceLineNo">609</span>    // if the table is enabled, then have the RS run actually the snapshot work<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    TableName snapshotTable = TableName.valueOf(snapshot.getTable());<a name="line.610"></a>
+<span class="sourceLineNo">611</span>    if (master.getTableStateManager().isTableState(snapshotTable,<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        TableState.State.ENABLED)) {<a name="line.612"></a>
+<span class="sourceLineNo">613</span>      LOG.debug("Table enabled, starting distributed snapshot.");<a name="line.613"></a>
+<span class="sourceLineNo">614</span>      snapshotEnabledTable(snapshot);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      LOG.debug("Started snapshot: " + ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    // For disabled table, snapshot is created by the master<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    else if (master.getTableStateManager().isTableState(snapshotTable,<a name="line.618"></a>
+<span class="sourceLineNo">619</span>        TableState.State.DISABLED)) {<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      LOG.debug("Table is disabled, running snapshot entirely on master.");<a name="line.620"></a>
+<span class="sourceLineNo">621</span>      snapshotDisabledTable(snapshot);<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      LOG.debug("Started snapshot: " + ClientSnapshotDescriptionUtils.toString(snapshot));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    } else {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      LOG.error("Can't snapshot table '" + snapshot.getTable()<a name="line.624"></a>
+<span class="sourceLineNo">625</span>          + "', isn't open or closed, we don't know what to do!");<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      TablePartiallyOpenException tpoe = new TablePartiallyOpenException(snapshot.getTable()<a name="line.626"></a>
+<span class="sourceLineNo">627</span>          + " isn't fully open.");<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      throw new SnapshotCreationException("Table is not entirely open or closed", tpoe,<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    // call post coproc hook<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    if (cpHost != null) {<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      cpHost.postSnapshot(snapshotPOJO, desc);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
+<span class="sourceLineNo">636</span>  }<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>  /**<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * Set the handler for the current snapshot<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * &lt;p&gt;<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   * Exposed for TESTING<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @param tableName<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   * @param handler handler the master should use<a name="line.643"></a>
+<span class="sourceLineNo">644</span>   *<a name="line.644"></a>
+<span class="sourceLineNo">645</span>   * TODO get rid of this if possible, repackaging, modify tests.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>   */<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  public synchronized void setSnapshotHandlerForTesting(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      final TableName tableName,<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      final SnapshotSentinel handler) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    if (handler != null) {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      this.snapshotHandlers.put(tableName, handler);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    } else {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      this.snapshotHandlers.remove(tableName);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    }<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>   * @return distributed commit coordinator for all running snapshots<a name="line.658"></a>
+<span class="sourceLineNo">659</span>   */<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  ProcedureCoordinator getCoordinator() {<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    return coordinator;<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>   * Check to see if the snapshot is one of the currently completed snapshots<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * Returns true if the snapshot exists in the "completed snapshots folder".<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   * @param snapshot expected snapshot to check<a name="line.668"></a>
+<span class="sourceLineNo">669</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the snapshot is stored on the {@link FileSystem}, &lt;tt&gt;false&lt;/tt&gt; if is<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   *         not stored<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * @throws IOException if the filesystem throws an unexpected exception,<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   * @throws IllegalArgumentException if snapshot name is invalid.<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   */<a name="line.673"></a>
+<span class="sourceLineNo">674</span>  private boolean isSnapshotCompleted(SnapshotDescription snapshot) throws IOException {<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    try {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      final Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshot, rootDir);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>      FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      // check to see if the snapshot already exists<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      return fs.exists(snapshotDir);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    } catch (IllegalArgumentException iae) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      throw new UnknownSnapshotException("Unexpected exception thrown", iae);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  /**<a name="line.685"></a>
+<span class="sourceLineNo">686</span>   * Clone the specified snapshot.<a name="line.686"></a>
+<span class="sourceLineNo">687</span>   * The clone will fail if the destination table has a snapshot or restore in progress.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   *<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   * @param reqSnapshot Snapshot Descriptor from request<a name="line.689"></a>
+<span class="sourceLineNo">690</span>   * @param tableName table to clone<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * @param snapshot Snapshot Descriptor<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   * @param snapshotTableDesc Table Descriptor<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * @return procId the ID of the clone snapshot procedure<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   * @throws IOException<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   */<a name="line.696"></a>
+<span class="sourceLineNo">697</span>  private long cloneSnapshot(final SnapshotDescription reqSnapshot, final TableName tableName,<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      final SnapshotDescription snapshot, final TableDescriptor snapshotTableDesc,<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      final NonceKey nonceKey, final boolean restoreAcl) throws IOException {<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    TableDescriptor htd = TableDescriptorBuilder.copy(tableName, snapshotTableDesc);<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    if (cpHost != null) {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      cpHost.preCloneSnapshot(snapshotPOJO, htd);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    }<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    long procId;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>      procId = cloneSnapshot(snapshot, htd, nonceKey, restoreAcl);<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    } catch (IOException e) {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      LOG.error("Exception occurred while cloning the snapshot " + snapshot.getName()<a name="line.711"></a>
+<span class="sourceLineNo">712</span>        + " as table " + tableName.getNameAsString(), e);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      throw e;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    LOG.info("Clone snapshot=" + snapshot.getName() + " as table=" + tableName);<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    if (cpHost != null) {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      cpHost.postCloneSnapshot(snapshotPOJO, htd);<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    return procId;<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>  /**<a name="line.723"></a>
+<span class="sourceLineNo">724</span>   * Clone the specified snapshot into a new table.<a name="line.724"></a>
+<span class="sourceLineNo">725</span>   * The operation will fail if the destination table has a snapshot or restore in progress.<a name="line.725"></a>
+<span class="sourceLineNo">726</span>   *<a name="line.726"></a>
+<span class="sourceLineNo">727</span>   * @param snapshot Snapshot Descriptor<a name="line.727"></a>
+<span class="sourceLineNo">728</span>   * @param tableDescriptor Table Descriptor of the table to create<a name="line.728"></a>
+<span class="sourceLineNo">729</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.729"></a>
+<span class="sourceLineNo">730</span>   * @return procId the ID of the clone snapshot procedure<a name="line.730"></a>
+<span class="sourceLineNo">731</span>   */<a name="line.731"></a>
+<span class="sourceLineNo">732</span>  synchronized long cloneSnapshot(final SnapshotDescription snapshot,<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      final TableDescriptor tableDescriptor, final NonceKey nonceKey, final boolean restoreAcl)<a name="line.733"></a>
+<span class="sourceLineNo">734</span>      throws HBaseSnapshotException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    TableName tableName = tableDescriptor.getTableName();<a name="line.735"></a>
+<span class="sourceLineNo">736</span><a name="line.736"></a>
+<span class="sourceLineNo">737</span>    // make sure we aren't running a snapshot on the same table<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    if (isTakingSnapshot(tableName)) {<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      throw new RestoreSnapshotException("Snapshot in progress on the restore table=" + tableName);<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>    // make sure we aren't running a restore on the same table<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    if (isRestoringTable(tableName)) {<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      throw new RestoreSnapshotException("Restore already in progress on the table=" + tableName);<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    }<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    try {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long procId = master.getMasterProcedureExecutor().submitProcedure(<a name="line.748"></a>
+<span class="sourceLineNo">749</span>        new CloneSnapshotProcedure(master.getMasterProcedureExecutor().getEnvironment(),<a name="line.749"></a>
+<span class="sourceLineNo">750</span>                tableDescriptor, snapshot, restoreAcl),<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        nonceKey);<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      this.restoreTableToProcIdMap.put(tableName, procId);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      return procId;<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    } catch (Exception e) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>      String msg = "Couldn't clone the snapshot="<a name="line.755"></a>
+<span class="sourceLineNo">756</span>        + ClientSnapshotDescriptionUtils.toString(snapshot) + " on table=" + tableName;<a name="line.756"></a>
+<span class="sourceLineNo">757</span>      LOG.error(msg, e);<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      throw new RestoreSnapshotException(msg, e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    }<a name="line.759"></a>
+<span class="sourceLineNo">760</span>  }<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span>  /**<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   * Restore or Clone the specified snapshot<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * @param reqSnapshot<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   * @throws IOException<a name="line.766"></a>
+<span class="sourceLineNo">767</span>   */<a name="line.767"></a>
+<span class="sourceLineNo">768</span>  public long restoreOrCloneSnapshot(final SnapshotDescription reqSnapshot, final NonceKey nonceKey,<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      final boolean restoreAcl) throws IOException {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(reqSnapshot, rootDir);<a name="line.771"></a>
+<span class="sourceLineNo">772</span><a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // check if the snapshot exists<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    if (!fs.exists(snapshotDir)) {<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      LOG.error("A Snapshot named '" + reqSnapshot.getName() + "' does not exist.");<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      throw new SnapshotDoesNotExistException(<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        ProtobufUtil.createSnapshotDesc(reqSnapshot));<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>    // Get snapshot info from file system. The reqSnapshot is a "fake" snapshotInfo with<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    // just the snapshot "name" and table name to restore. It does not contains the "real" snapshot<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    // information.<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    SnapshotDescription snapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    SnapshotManifest manifest = SnapshotManifest.open(master.getConfiguration(), fs,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        snapshotDir, snapshot);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    TableDescriptor snapshotTableDesc = manifest.getTableDescriptor();<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    TableName tableName = TableName.valueOf(reqSnapshot.getTable());<a name="line.787"></a>
+<span class="sourceLineNo">788</span><a name="line.788"></a>
+<span class="sourceLineNo">789</span>    // stop tracking "abandoned" handlers<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    cleanupSentinels();<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>    // Verify snapshot validity<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    SnapshotReferenceUtil.verifySnapshot(master.getConfiguration(), fs, manifest);<a name="line.793"></a>
+<span class="sourceLineNo">794</span><a name="line.794"></a>
+<span class="sourceLineNo">795</span>    // Execute the restore/clone operation<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    long procId;<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    if (MetaTableAccessor.tableExists(master.getConnection(), tableName)) {<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      procId = restoreSnapshot(reqSnapshot, tableName, snapshot, snapshotTableDesc, nonceKey,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        restoreAcl);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    } else {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      procId =<a name="line.801"></a>
+<span class="sourceLineNo">802</span>          cloneSnapshot(reqSnapshot, tableName, snapshot, snapshotTableDesc, nonceKey, restoreAcl);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    }<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    return procId;<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>   * Restore the specified snapshot. The restore will fail if the destination table has a snapshot<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   * or restore in progress.<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   * @param reqSnapshot Snapshot Descriptor from request<a name="line.810"></a>
+<span class="sourceLineNo">811</span>   * @param tableName table to restore<a name="line.811"></a>
+<span class="sourceLineNo">812</span>   * @param snapshot Snapshot Descriptor<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   * @param snapshotTableDesc Table Descriptor<a name="line.813"></a>
+<span class="sourceLineNo">814</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.814"></a>
+<span class="sourceLineNo">815</span>   * @param restoreAcl true to restore acl of snapshot<a name="line.815"></a>
+<span class="sourceLineNo">816</span>   * @return procId the ID of the restore snapshot procedure<a name="line.816"></a>
+<span class="sourceLineNo">817</span>   * @throws IOException<a name="line.817"></a>
+<span class="sourceLineNo">818</span>   */<a name="line.818"></a>
+<span class="sourceLineNo">819</span>  private long restoreSnapshot(final SnapshotDescription reqSnapshot, final TableName tableName,<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      final SnapshotDescription snapshot, final TableDescriptor snapshotTableDesc,<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      final NonceKey nonceKey, final boolean restoreAcl) throws IOException {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.822"></a>
+<span class="sourceLineNo">823</span><a name="line.823"></a>
+<span class="sourceLineNo">824</span>    if (master.getTableStateManager().isTableState(<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      TableName.valueOf(snapshot.getTable()), TableState.State.ENABLED)) {<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      throw new UnsupportedOperationException("Table '" +<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        TableName.valueOf(snapshot.getTable()) + "' must be disabled in order to " +<a name="line.827"></a>
+<span class="sourceLineNo">828</span>        "perform a restore operation.");<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>    // call Coprocessor pre hook<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    if (cpHost != null) {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      cpHost.preRestoreSnapshot(snapshotPOJO, snapshotTableDesc);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
+<span class="sourceLineNo">837</span><a name="line.837"></a>
+<span class="sourceLineNo">838</span>    long procId;<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    try {<a name="line.839"></a>
+<span class="sourceLineNo">840</span>      procId = restoreSnapshot(snapshot, snapshotTableDesc, nonceKey, restoreAcl);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    } catch (IOException e) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      LOG.error("Exception occurred while restoring the snapshot " + snapshot.getName()<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        + " as table " + tableName.getNameAsString(), e);<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      throw e;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    LOG.info("Restore snapshot=" + snapshot.getName() + " as table=" + tableName);<a name="line.846"></a>
 <span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>    return procId;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>  }<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>  /**<a name="line.851"></a>
-<span class="sourceLineNo">852</span>   * Restore the specified snapshot. The restore will fail if the destination table has a snapshot<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * or restore in progress.<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * @param snapshot Snapshot Descriptor<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   * @param tableDescriptor Table Descriptor<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * @param nonceKey unique identifier to prevent duplicated RPC<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param restoreAcl true to restore acl of snapshot<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @return procId the ID of the restore snapshot procedure<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   */<a name="line.859"></a>
-<span class="sourceLineNo">860</span>  private synchronized long restoreSnapshot(final SnapshotDescription snapshot,<a name="line.860"></a>
-<span class="sourceLineNo">861</span>      final TableDescriptor tableDescriptor, final NonceKey nonceKey, final boolean restoreAcl)<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      throws HBaseSnapshotException {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    final TableName tableName = tableDescriptor.getTableName();<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    // make sure we aren't running a snapshot on the same table<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    if (isTakingSnapshot(tableName)) {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      throw new RestoreSnapshotException("Snapshot in progress on the restore table=" + tableName);<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    }<a name="line.868"></a>
-<span class="sourceLineNo">869</span><a name="line.869"></a>
-<span class="sourceLineNo">870</span>    // make sure we aren't running a restore on the same table<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    if (isRestoringTable(tableName)) {<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      throw new RestoreSnapshotException("Restore already in progress on the table=" + tableName);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>    }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>    try {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      long procId = master.getMasterProcedureExecutor().submitProcedure(<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        new RestoreSnapshotProcedure(master.getMasterProcedureExecutor().getEnvironment(),<a name="line.877"></a>
-<span class="sourceLineNo">878</span>                tableDescriptor, snapshot, restoreAcl),<a name="line.878"></a>
-<span class="sourceLineNo">879</span>        nonceKey);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      this.restoreTableToProcIdMap.put(tableName, procId);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>      return procId;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    } catch (Exception e) {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      String msg = "Couldn't restore the snapshot=" + ClientSnapshotDescriptionUtils.toString(<a name="line.883"></a>
-<span class="sourceLineNo">884</span>          snapshot)  +<a name="line.884"></a>
-<span class="sourceLineNo">885</span>          " on table=" + tableName;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      LOG.error(msg, e);<a name="line.886"></a>
-<span class="sourceLineNo">887</span>      throw new RestoreSnapshotException(msg, e);<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span>  }<a name="line.889"></a>
-<span class="sourceLineNo">890</span><a name="line.890"></a>
-<span class="sourceLineNo">891</span>  /**<a name="line.891"></a>
-<span class="sourceLineNo">892</span>   * Verify if the restore of the specified table is in progress.<a name="line.892"></a>
-<span class="sourceLineNo">893</span>   *<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * @param tableName table under restore<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if there is a restore in progress of the specified table.<a name="line.895"></a>
-<span class="sourceLineNo">896</span>   */<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  private synchronized boolean isRestoringTable(final TableName tableName) {<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    Long procId = this.restoreTableToProcIdMap.get(tableName);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    if (procId == null) {<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      return false;<a name="line.900"></a>
-<span class="sourceLineNo">901</span>    }<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec = master.getMasterProcedureExecutor();<a name="line.902"></a>
-<span class="sourceLineNo">903</span>    if (procExec.isRunning() &amp;&amp; !procExec.isFinished(procId)) {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return true;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    } else {<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      this.restoreTableToProcIdMap.remove(tableName);<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      return false;<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    }<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>  }<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>   * Return the handler if it is currently live and has the same snapshot target name.<a name="line.913"></a>
-<span class="sourceLineNo">914</span>   * The handler is removed from the sentinels map if completed.<a name="line.914"></a>
-<span class="sourceLineNo">915</span>   * @param sentinels live handlers<a name="line.915"></a>
-<span class="sourceLineNo">916</span>   * @param snapshot snapshot description<a name="line.916"></a>
-<span class="sourceLineNo">917</span>   * @return null if doesn't match, else a live handler.<a name="line.917"></a>
-<span class="sourceLineNo">918</span>   */<a name="line.918"></a>
-<span class="sourceLineNo">919</span>  private synchronized SnapshotSentinel removeSentinelIfFinished(<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      final Map&lt;TableName, SnapshotSentinel&gt; sentinels,<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      final SnapshotDescription snapshot) {<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    if (!snapshot.hasTable()) {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      return null;<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
-<span class="sourceLineNo">925</span><a name="line.925"></a>
-<span class="sourceLineNo">926</span>    TableName snapshotTable = TableName.valueOf(snapshot.getTable());<a name="line.926"></a>
-<span class="sourceLineNo">927</span>    SnapshotSentinel h = sentinels.get(snapshotTable);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    if (h == null) {<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      return 

<TRUNCATED>