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/11/23 14:52:15 UTC

[01/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site e1f06e8a1 -> 3353a0ace


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
new file mode 100644
index 0000000..51e3ac1
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
@@ -0,0 +1,571 @@
+<!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>TestSnapshotWhenChoreCleaning (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="TestSnapshotWhenChoreCleaning (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":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/TestSnapshotWhenChoreCleaning.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/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li>Next&nbsp;Class</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotWhenChoreCleaning.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.snapshot</div>
+<h2 title="Class TestSnapshotWhenChoreCleaning" class="title">Class TestSnapshotWhenChoreCleaning</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.snapshot.TestSnapshotWhenChoreCleaning</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/TestSnapshotWhenChoreCleaning.html#line.61">TestSnapshotWhenChoreCleaning</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 Case for HBASE-21387</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/snapshot/TestSnapshotWhenChoreCleaning.html#CLASS_RULE">CLASS_RULE</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/snapshot/TestSnapshotWhenChoreCleaning.html#CONF">CONF</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#FAMILY">FAMILY</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/snapshot/TestSnapshotWhenChoreCleaning.html#LOG">LOG</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/snapshot/TestSnapshotWhenChoreCleaning.html#MAX_SPLIT_KEYS_NUM">MAX_SPLIT_KEYS_NUM</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#QUALIFIER">QUALIFIER</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.client.Table</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TABLE">TABLE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.TableName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TABLE_NAME">TABLE_NAME</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_TABLE">TEST_TABLE</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"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#VALUE">VALUE</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/snapshot/TestSnapshotWhenChoreCleaning.html#TestSnapshotWhenChoreCleaning--">TestSnapshotWhenChoreCleaning</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>private static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#createTable--">createTable</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#integerToBytes-int-">integerToBytes</a></span>(int&nbsp;i)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>private static boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#isAnySnapshots-org.apache.hadoop.fs.FileSystem-">isAnySnapshots</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs)</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#listHFileNames-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">listHFileNames</a></span>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+              org.apache.hadoop.fs.Path&nbsp;tableDir)</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>private static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#loadDataAndFlush--">loadDataAndFlush</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#setUp--">setUp</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#tearDown--">tearDown</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/snapshot/TestSnapshotWhenChoreCleaning.html#testSnapshotWhenSnapshotHFileCleanerRunning--">testSnapshotWhenSnapshotHFileCleanerRunning</a></span>()</code>&nbsp;</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/snapshot/TestSnapshotWhenChoreCleaning.html#line.64">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="TEST_UTIL">
+<!--   -->
+</a>
+<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/snapshot/TestSnapshotWhenChoreCleaning.html#line.67">TEST_UTIL</a></pre>
+</li>
+</ul>
+<a name="CONF">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CONF</h4>
+<pre>private static final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.68">CONF</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/snapshot/TestSnapshotWhenChoreCleaning.html#line.69">LOG</a></pre>
+</li>
+</ul>
+<a name="TABLE_NAME">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TABLE_NAME</h4>
+<pre>private static final&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.70">TABLE_NAME</a></pre>
+</li>
+</ul>
+<a name="MAX_SPLIT_KEYS_NUM">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>MAX_SPLIT_KEYS_NUM</h4>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.71">MAX_SPLIT_KEYS_NUM</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.snapshot.TestSnapshotWhenChoreCleaning.MAX_SPLIT_KEYS_NUM">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="FAMILY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FAMILY</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.72">FAMILY</a></pre>
+</li>
+</ul>
+<a name="QUALIFIER">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>QUALIFIER</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.73">QUALIFIER</a></pre>
+</li>
+</ul>
+<a name="VALUE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>VALUE</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.74">VALUE</a></pre>
+</li>
+</ul>
+<a name="TABLE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TABLE</h4>
+<pre>private static&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.75">TABLE</a></pre>
+</li>
+</ul>
+<a name="TEST_TABLE">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TEST_TABLE</h4>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.78">TEST_TABLE</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="TestSnapshotWhenChoreCleaning--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestSnapshotWhenChoreCleaning</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.61">TestSnapshotWhenChoreCleaning</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="setUp--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUp</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.81">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="integerToBytes-int-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>integerToBytes</h4>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.92">integerToBytes</a>(int&nbsp;i)</pre>
+</li>
+</ul>
+<a name="createTable--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>createTable</h4>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.96">createTable</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="tearDown--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>tearDown</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.105">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="loadDataAndFlush--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>loadDataAndFlush</h4>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.109">loadDataAndFlush</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="listHFileNames-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>listHFileNames</h4>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.118">listHFileNames</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+                                                              org.apache.hadoop.fs.Path&nbsp;tableDir)
+                                                       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="isAnySnapshots-org.apache.hadoop.fs.FileSystem-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>isAnySnapshots</h4>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.128">isAnySnapshots</a>(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>
+<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="testSnapshotWhenSnapshotHFileCleanerRunning--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testSnapshotWhenSnapshotHFileCleanerRunning</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.144">testSnapshotWhenSnapshotHFileCleanerRunning</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>
+</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/TestSnapshotWhenChoreCleaning.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/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li>Next&nbsp;Class</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotWhenChoreCleaning.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/3353a0ac/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestSnapshotWhenChoreCleaning.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestSnapshotWhenChoreCleaning.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestSnapshotWhenChoreCleaning.html
new file mode 100644
index 0000000..5747c2d
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/class-use/TestSnapshotWhenChoreCleaning.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.TestSnapshotWhenChoreCleaning (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.TestSnapshotWhenChoreCleaning (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/TestSnapshotWhenChoreCleaning.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/TestSnapshotWhenChoreCleaning.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotWhenChoreCleaning.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.TestSnapshotWhenChoreCleaning" class="title">Uses of Class<br>org.apache.hadoop.hbase.snapshot.TestSnapshotWhenChoreCleaning</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.snapshot.TestSnapshotWhenChoreCleaning</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/TestSnapshotWhenChoreCleaning.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/TestSnapshotWhenChoreCleaning.html" target="_top">Frames</a></li>
+<li><a href="TestSnapshotWhenChoreCleaning.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/3353a0ac/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 749a61f..84f3987 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-frame.html
@@ -41,6 +41,7 @@
 <li><a href="TestSnapshotClientRetries.MasterSyncObserver.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotClientRetries.MasterSyncObserver</a></li>
 <li><a href="TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotDescriptionUtils</a></li>
 <li><a href="TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotManifest</a></li>
+<li><a href="TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotWhenChoreCleaning</a></li>
 </ul>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 87bcf2c..aeff2ba 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-summary.html
@@ -227,6 +227,12 @@
 <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>
+<tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></td>
+<td class="colLast">
+<div class="block">Test Case for HBASE-21387</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 511e7fc..81fc2e2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/package-tree.html
@@ -123,6 +123,7 @@
 <li type="circle">org.apache.hadoop.hbase.snapshot.<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> (implements org.apache.hadoop.hbase.coprocessor.MasterCoprocessor, org.apache.hadoop.hbase.coprocessor.MasterObserver)</li>
 <li type="circle">org.apache.hadoop.hbase.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestSnapshotDescriptionUtils</span></a></li>
 <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.snapshot.<a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestSnapshotWhenChoreCleaning</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 1bd5f18..3c4b4a9 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/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</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/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/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 f62b3ca..7ec7716 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -147,9 +147,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/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>
 <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/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/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index bc9a9cb..71255d7 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -3781,6 +3781,7 @@
 <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.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestSnapshotWhenChoreCleaning</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotWhileRSCrashes.html" title="class in org.apache.hadoop.hbase.master.snapshot"><span class="typeNameLink">TestSnapshotWhileRSCrashes</span></a></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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.SnapshotFiles.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.SnapshotFiles.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.SnapshotFiles.html
index 201cbdc..c0230a7 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.SnapshotFiles.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.SnapshotFiles.html
@@ -155,9 +155,9 @@
 <span class="sourceLineNo">147</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.147"></a>
 <span class="sourceLineNo">148</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles()) {<a name="line.148"></a>
 <span class="sourceLineNo">149</span>      @Override<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      List&lt;String&gt; getSnapshotsInProgress(final SnapshotManager snapshotManager)<a name="line.150"></a>
+<span class="sourceLineNo">150</span>      List&lt;String&gt; getSnapshotsInProgress()<a name="line.150"></a>
 <span class="sourceLineNo">151</span>              throws IOException {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        List&lt;String&gt; result = super.getSnapshotsInProgress(snapshotManager);<a name="line.152"></a>
+<span class="sourceLineNo">152</span>        List&lt;String&gt; result = super.getSnapshotsInProgress();<a name="line.152"></a>
 <span class="sourceLineNo">153</span>        count.incrementAndGet();<a name="line.153"></a>
 <span class="sourceLineNo">154</span>        return result;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>      }<a name="line.155"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html
index 201cbdc..c0230a7 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/TestSnapshotFileCache.html
@@ -155,9 +155,9 @@
 <span class="sourceLineNo">147</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.147"></a>
 <span class="sourceLineNo">148</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles()) {<a name="line.148"></a>
 <span class="sourceLineNo">149</span>      @Override<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      List&lt;String&gt; getSnapshotsInProgress(final SnapshotManager snapshotManager)<a name="line.150"></a>
+<span class="sourceLineNo">150</span>      List&lt;String&gt; getSnapshotsInProgress()<a name="line.150"></a>
 <span class="sourceLineNo">151</span>              throws IOException {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>        List&lt;String&gt; result = super.getSnapshotsInProgress(snapshotManager);<a name="line.152"></a>
+<span class="sourceLineNo">152</span>        List&lt;String&gt; result = super.getSnapshotsInProgress();<a name="line.152"></a>
 <span class="sourceLineNo">153</span>        count.incrementAndGet();<a name="line.153"></a>
 <span class="sourceLineNo">154</span>        return result;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>      }<a name="line.155"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 e9e09f3..eb9cd10 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
@@ -153,7 +153,7 @@
 <span class="sourceLineNo">145</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.145"></a>
 <span class="sourceLineNo">146</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    try {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      cache.getSnapshotsInProgress(null);<a name="line.148"></a>
+<span class="sourceLineNo">148</span>      cache.getSnapshotsInProgress();<a name="line.148"></a>
 <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>
@@ -181,7 +181,7 @@
 <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">176</span>      cache.getSnapshotsInProgress();<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>
@@ -205,7 +205,7 @@
 <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">200</span>    cache.getSnapshotsInProgress();<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/3353a0ac/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 e9e09f3..eb9cd10 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
@@ -153,7 +153,7 @@
 <span class="sourceLineNo">145</span>    SnapshotFileCache cache = new SnapshotFileCache(fs, rootDir, period, 10000000,<a name="line.145"></a>
 <span class="sourceLineNo">146</span>        "test-snapshot-file-cache-refresh", new SnapshotFiles());<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    try {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      cache.getSnapshotsInProgress(null);<a name="line.148"></a>
+<span class="sourceLineNo">148</span>      cache.getSnapshotsInProgress();<a name="line.148"></a>
 <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>
@@ -181,7 +181,7 @@
 <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">176</span>      cache.getSnapshotsInProgress();<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>
@@ -205,7 +205,7 @@
 <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">200</span>    cache.getSnapshotsInProgress();<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/3353a0ac/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
new file mode 100644
index 0000000..224d47b
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html
@@ -0,0 +1,279 @@
+<!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><a name="line.18"></a>
+<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.snapshot;<a name="line.19"></a>
+<span class="sourceLineNo">020</span><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.ArrayList;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.Collections;<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.concurrent.atomic.AtomicBoolean;<a name="line.25"></a>
+<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.conf.Configuration;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.fs.FileStatus;<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.HBaseClassTestRule;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<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.TestTableName;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Put;<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.master.HMaster;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.master.snapshot.SnapshotHFileCleaner;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<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>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.util.FSVisitor;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.junit.AfterClass;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.junit.Assert;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.junit.BeforeClass;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.junit.ClassRule;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.junit.Rule;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.junit.Test;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.junit.experimental.categories.Category;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.slf4j.Logger;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.slf4j.LoggerFactory;<a name="line.52"></a>
+<span class="sourceLineNo">053</span><a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableMap;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<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> * Test Case for HBASE-21387<a name="line.58"></a>
+<span class="sourceLineNo">059</span> */<a name="line.59"></a>
+<span class="sourceLineNo">060</span>@Category({ LargeTests.class })<a name="line.60"></a>
+<span class="sourceLineNo">061</span>public class TestSnapshotWhenChoreCleaning {<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>  @ClassRule<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      HBaseClassTestRule.forClass(TestSnapshotWhenChoreCleaning.class);<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private static final Configuration CONF = TEST_UTIL.getConfiguration();<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private static final Logger LOG = LoggerFactory.getLogger(TestSnapshotClientRetries.class);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static final TableName TABLE_NAME = TableName.valueOf("testTable");<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private static final int MAX_SPLIT_KEYS_NUM = 100;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private static final byte[] FAMILY = Bytes.toBytes("family");<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  private static final byte[] QUALIFIER = Bytes.toBytes("qualifier");<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static final byte[] VALUE = Bytes.toBytes("value");<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private static Table TABLE;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  @Rule<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public TestTableName TEST_TABLE = new TestTableName();<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  @BeforeClass<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  public static void setUp() throws Exception {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    // Set the hbase.snapshot.thread.pool.max to 1;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    CONF.setInt("hbase.snapshot.thread.pool.max", 1);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    // Enable snapshot<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    CONF.setBoolean(SnapshotManager.HBASE_SNAPSHOT_ENABLED, true);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    // Start MiniCluster.<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    TEST_UTIL.startMiniCluster(3);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    // Create talbe<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    createTable();<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>  private static byte[] integerToBytes(int i) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    return Bytes.toBytes(String.format("%06d", i));<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>  private static void createTable() throws IOException {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    byte[][] splitKeys = new byte[MAX_SPLIT_KEYS_NUM][];<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    for (int i = 0; i &lt; splitKeys.length; i++) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      splitKeys[i] = integerToBytes(i);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    TABLE = TEST_UTIL.createTable(TABLE_NAME, FAMILY, splitKeys);<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>  @AfterClass<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static void tearDown() throws Exception {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    TEST_UTIL.shutdownMiniCluster();<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>  private static void loadDataAndFlush() throws IOException {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    for (int i = 0; i &lt; MAX_SPLIT_KEYS_NUM; i++) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      Put put = new Put(integerToBytes(i)).addColumn(FAMILY, QUALIFIER,<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        Bytes.add(VALUE, Bytes.toBytes(i)));<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      TABLE.put(put);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    TEST_UTIL.flush(TABLE_NAME);<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>  private static List&lt;Path&gt; listHFileNames(final FileSystem fs, final Path tableDir)<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      throws IOException {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    final List&lt;Path&gt; hfiles = new ArrayList&lt;&gt;();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    FSVisitor.visitTableStoreFiles(fs, tableDir, (region, family, hfileName) -&gt; {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      hfiles.add(new Path(new Path(new Path(tableDir, region), family), hfileName));<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    });<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    Collections.sort(hfiles);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return hfiles;<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>  private static boolean isAnySnapshots(FileSystem fs) throws IOException {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    Path snapshotDir = SnapshotDescriptionUtils.getSnapshotsDir(FSUtils.getRootDir(CONF));<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    FileStatus[] snapFiles = fs.listStatus(snapshotDir);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    if (snapFiles.length == 0) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      return false;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    Path firstPath = snapFiles[0].getPath();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    LOG.info("firstPath in isAnySnapshots: " + firstPath);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    if (snapFiles.length == 1 &amp;&amp; firstPath.getName().equals(".tmp")) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      FileStatus[] tmpSnapFiles = fs.listStatus(firstPath);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      return tmpSnapFiles != null &amp;&amp; tmpSnapFiles.length &gt; 0;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    return true;<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>  @Test<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public void testSnapshotWhenSnapshotHFileCleanerRunning() throws Exception {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // Load data and flush to generate huge number of HFiles.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    loadDataAndFlush();<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>    SnapshotHFileCleaner cleaner = new SnapshotHFileCleaner();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    cleaner.init(ImmutableMap.of(HMaster.MASTER, TEST_UTIL.getHBaseCluster().getMaster()));<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    cleaner.setConf(CONF);<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>    FileSystem fs = FSUtils.getCurrentFileSystem(CONF);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    List&lt;Path&gt; fileNames =<a name="line.153"></a>
+<span class="sourceLineNo">154</span>        listHFileNames(fs, FSUtils.getTableDir(FSUtils.getRootDir(CONF), TABLE_NAME));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    List&lt;FileStatus&gt; files = new ArrayList&lt;&gt;();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    for (Path fileName : fileNames) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      files.add(fs.getFileStatus(fileName));<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    TEST_UTIL.getAdmin().snapshot("snapshotName_prev", TABLE_NAME);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    Assert.assertEquals(Lists.newArrayList(cleaner.getDeletableFiles(files)).size(), 0);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    TEST_UTIL.getAdmin().deleteSnapshot("snapshotName_prev");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    cleaner.getFileCacheForTesting().triggerCacheRefreshForTesting();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    Assert.assertEquals(Lists.newArrayList(cleaner.getDeletableFiles(files)).size(), 100);<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>    Runnable snapshotRunnable = () -&gt; {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      try {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        // The thread will be busy on taking snapshot;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        for (int k = 0; k &lt; 5; k++) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>          TEST_UTIL.getAdmin().snapshot("snapshotName_" + k, TABLE_NAME);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      } catch (Exception e) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        LOG.error("Snapshot failed: ", e);<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>    final AtomicBoolean success = new AtomicBoolean(true);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    Runnable cleanerRunnable = () -&gt; {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        while (!isAnySnapshots(fs)) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>          LOG.info("Not found any snapshot, sleep 100ms");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          Thread.sleep(100);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        for (int k = 0; k &lt; 5; k++) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          cleaner.getFileCacheForTesting().triggerCacheRefreshForTesting();<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          Iterable&lt;FileStatus&gt; toDeleteFiles = cleaner.getDeletableFiles(files);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>          List&lt;FileStatus&gt; deletableFiles = Lists.newArrayList(toDeleteFiles);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>          LOG.info("Size of deletableFiles is: " + deletableFiles.size());<a name="line.187"></a>
+<span class="sourceLineNo">188</span>          for (int i = 0; i &lt; deletableFiles.size(); i++) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>            LOG.debug("toDeleteFiles[{}] is: {}", i, deletableFiles.get(i));<a name="line.189"></a>
+<span class="sourceLineNo">190</span>          }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>          if (deletableFiles.size() &gt; 0) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>            success.set(false);<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>      } catch (Exception e) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        LOG.error("Chore cleaning failed: ", e);<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>    Thread t1 = new Thread(snapshotRunnable);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    t1.start();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    Thread t2 = new Thread(cleanerRunnable);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    t2.start();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    t1.join();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    t2.join();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    Assert.assertTrue(success.get());<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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


[07/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotFileInspector.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotFileInspector.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotFileInspector.html
index 206b623..796ddc1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotFileInspector.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotFileInspector.html
@@ -35,7 +35,7 @@
 <span class="sourceLineNo">027</span>import java.util.Set;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Timer;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.TimerTask;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.locks.ReentrantLock;<a name="line.30"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.locks.Lock;<a name="line.30"></a>
 <span class="sourceLineNo">031</span><a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.fs.FileStatus;<a name="line.33"></a>
@@ -192,183 +192,191 @@
 <span class="sourceLineNo">184</span>    List&lt;FileStatus&gt; unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    List&lt;String&gt; snapshotsInProgress = null;<a name="line.185"></a>
 <span class="sourceLineNo">186</span>    boolean refreshed = false;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    for (FileStatus file : files) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      String fileName = file.getPath().getName();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        refreshCache();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        refreshed = true;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      }<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      if (cache.contains(fileName)) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        continue;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      if (snapshotsInProgress == null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        snapshotsInProgress = getSnapshotsInProgress(snapshotManager);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (snapshotsInProgress.contains(fileName)) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        continue;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      unReferencedFiles.add(file);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    return unReferencedFiles;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>  private synchronized void refreshCache() throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    FileStatus dirStatus;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    try {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    } catch (FileNotFoundException e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (this.cache.size() &gt; 0) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // directory was modified, so we need to reload our cache<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // 1. update the modified time<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 2.clear the cache<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cache.clear();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // 3. check each of the snapshot directories<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (snapshots == null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      // remove all the remembered snapshots because we don't have any left<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      this.snapshots.clear();<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>    // 3.1 iterate through the on-disk snapshots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    for (FileStatus snapshot : snapshots) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      String name = snapshot.getPath().getName();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      // its not the tmp dir,<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        // probably changed.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          // get all files for the snapshot and create a new info<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        // 3.2 add all the files to cache<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        this.cache.addAll(files.getFiles());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        known.put(name, files);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // 4. set the snapshots we are tracking<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.snapshots.clear();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    this.snapshots.putAll(known);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  @VisibleForTesting List&lt;String&gt; getSnapshotsInProgress(<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    final SnapshotManager snapshotManager) throws IOException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // only add those files to the cache, but not to the known snapshots<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    // only add those files to the cache, but not to the known snapshots<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (running != null) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      for (FileStatus run : running) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        ReentrantLock lock = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        if (snapshotManager != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          lock = snapshotManager.getLocks().acquireLock(run.getPath().getName());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        try {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        } catch (CorruptedSnapshotException e) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          // See HBASE-16464<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            // If the snapshot is corrupt, we will delete it<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            fs.delete(run.getPath(), true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            throw e;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } finally {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          if (lock != null) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>            lock.unlock();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return snapshotInProgress;<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>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public class RefreshCacheTask extends TimerTask {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    public void run() {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        SnapshotFileCache.this.refreshCache();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      } catch (IOException e) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<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>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(String why) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!this.stop) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.stop = true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.refreshTimer.cancel();<a name="line.324"></a>
+<span class="sourceLineNo">187</span>    Lock lock = null;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (snapshotManager != null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      lock = snapshotManager.getTakingSnapshotLock().writeLock();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    if (lock == null || lock.tryLock()) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      try {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        if (snapshotManager == null || snapshotManager.isTakingAnySnapshot()) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>          LOG.warn("Not checking unreferenced files since snapshot is running, it will "<a name="line.194"></a>
+<span class="sourceLineNo">195</span>              + "skip to clean the HFiles this time");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>          return unReferencedFiles;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        for (FileStatus file : files) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          String fileName = file.getPath().getName();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            refreshCache();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            refreshed = true;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          if (cache.contains(fileName)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>            continue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          if (snapshotsInProgress == null) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>            snapshotsInProgress = getSnapshotsInProgress();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          if (snapshotsInProgress.contains(fileName)) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>            continue;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          unReferencedFiles.add(file);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      } finally {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (lock != null) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          lock.unlock();<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>    return unReferencedFiles;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  private synchronized void refreshCache() throws IOException {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    FileStatus dirStatus;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    try {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    } catch (FileNotFoundException e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      if (this.cache.size() &gt; 0) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // directory was modified, so we need to reload our cache<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // 1. update the modified time<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 2.clear the cache<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.cache.clear();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // 3. check each of the snapshot directories<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    if (snapshots == null) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      // remove all the remembered snapshots because we don't have any left<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      this.snapshots.clear();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return;<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>    // 3.1 iterate through the on-disk snapshots<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    for (FileStatus snapshot : snapshots) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      String name = snapshot.getPath().getName();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      // its not the tmp dir,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        // probably changed.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          // get all files for the snapshot and create a new info<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        // 3.2 add all the files to cache<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        this.cache.addAll(files.getFiles());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        known.put(name, files);<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><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // 4. set the snapshots we are tracking<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    this.snapshots.clear();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    this.snapshots.putAll(known);<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>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  List&lt;String&gt; getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // only add those files to the cache, but not to the known snapshots<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    if (running != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      for (FileStatus run : running) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        try {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        } catch (CorruptedSnapshotException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          // See HBASE-16464<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            // If the snapshot is corrupt, we will delete it<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            fs.delete(run.getPath(), true);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          } else {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            throw e;<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>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return snapshotInProgress;<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>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public class RefreshCacheTask extends TimerTask {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public void run() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        SnapshotFileCache.this.refreshCache();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<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><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public boolean isStopped() {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return this.stop;<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>   * Information about a snapshot directory<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private static class SnapshotDirectoryInfo {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    long lastModified;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    Collection&lt;String&gt; files;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      this.lastModified = mtime;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>     */<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    public Collection&lt;String&gt; getFiles() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      return this.files;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>    /**<a name="line.353"></a>
-<span class="sourceLineNo">354</span>     * Check if the snapshot directory has been modified<a name="line.354"></a>
-<span class="sourceLineNo">355</span>     * @param mtime current modification time of the directory<a name="line.355"></a>
-<span class="sourceLineNo">356</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>     */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    public boolean hasBeenModified(long mtime) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      return this.lastModified &lt; mtime;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>}<a name="line.363"></a>
+<span class="sourceLineNo">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 void stop(String why) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    if (!this.stop) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.stop = true;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.refreshTimer.cancel();<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><a name="line.336"></a>
+<span class="sourceLineNo">337</span>  @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public boolean isStopped() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return this.stop;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * Information about a snapshot directory<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   */<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private static class SnapshotDirectoryInfo {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    long lastModified;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    Collection&lt;String&gt; files;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      this.lastModified = mtime;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>     */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Collection&lt;String&gt; getFiles() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      return this.files;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<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>     * Check if the snapshot directory has been modified<a name="line.362"></a>
+<span class="sourceLineNo">363</span>     * @param mtime current modification time of the directory<a name="line.363"></a>
+<span class="sourceLineNo">364</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>     */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    public boolean hasBeenModified(long mtime) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      return this.lastModified &lt; mtime;<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>}<a name="line.371"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
index 206b623..796ddc1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
@@ -35,7 +35,7 @@
 <span class="sourceLineNo">027</span>import java.util.Set;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Timer;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.TimerTask;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.locks.ReentrantLock;<a name="line.30"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.locks.Lock;<a name="line.30"></a>
 <span class="sourceLineNo">031</span><a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.fs.FileStatus;<a name="line.33"></a>
@@ -192,183 +192,191 @@
 <span class="sourceLineNo">184</span>    List&lt;FileStatus&gt; unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    List&lt;String&gt; snapshotsInProgress = null;<a name="line.185"></a>
 <span class="sourceLineNo">186</span>    boolean refreshed = false;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    for (FileStatus file : files) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      String fileName = file.getPath().getName();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        refreshCache();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        refreshed = true;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      }<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      if (cache.contains(fileName)) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        continue;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      if (snapshotsInProgress == null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        snapshotsInProgress = getSnapshotsInProgress(snapshotManager);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (snapshotsInProgress.contains(fileName)) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        continue;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      unReferencedFiles.add(file);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    return unReferencedFiles;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>  private synchronized void refreshCache() throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    FileStatus dirStatus;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    try {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    } catch (FileNotFoundException e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (this.cache.size() &gt; 0) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // directory was modified, so we need to reload our cache<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // 1. update the modified time<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 2.clear the cache<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cache.clear();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // 3. check each of the snapshot directories<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (snapshots == null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      // remove all the remembered snapshots because we don't have any left<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      this.snapshots.clear();<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>    // 3.1 iterate through the on-disk snapshots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    for (FileStatus snapshot : snapshots) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      String name = snapshot.getPath().getName();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      // its not the tmp dir,<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        // probably changed.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          // get all files for the snapshot and create a new info<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        // 3.2 add all the files to cache<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        this.cache.addAll(files.getFiles());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        known.put(name, files);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // 4. set the snapshots we are tracking<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.snapshots.clear();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    this.snapshots.putAll(known);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  @VisibleForTesting List&lt;String&gt; getSnapshotsInProgress(<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    final SnapshotManager snapshotManager) throws IOException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // only add those files to the cache, but not to the known snapshots<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    // only add those files to the cache, but not to the known snapshots<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (running != null) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      for (FileStatus run : running) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        ReentrantLock lock = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        if (snapshotManager != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          lock = snapshotManager.getLocks().acquireLock(run.getPath().getName());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        try {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        } catch (CorruptedSnapshotException e) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          // See HBASE-16464<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            // If the snapshot is corrupt, we will delete it<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            fs.delete(run.getPath(), true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            throw e;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } finally {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          if (lock != null) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>            lock.unlock();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return snapshotInProgress;<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>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public class RefreshCacheTask extends TimerTask {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    public void run() {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        SnapshotFileCache.this.refreshCache();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      } catch (IOException e) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<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>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(String why) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!this.stop) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.stop = true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.refreshTimer.cancel();<a name="line.324"></a>
+<span class="sourceLineNo">187</span>    Lock lock = null;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (snapshotManager != null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      lock = snapshotManager.getTakingSnapshotLock().writeLock();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    if (lock == null || lock.tryLock()) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      try {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        if (snapshotManager == null || snapshotManager.isTakingAnySnapshot()) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>          LOG.warn("Not checking unreferenced files since snapshot is running, it will "<a name="line.194"></a>
+<span class="sourceLineNo">195</span>              + "skip to clean the HFiles this time");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>          return unReferencedFiles;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        for (FileStatus file : files) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          String fileName = file.getPath().getName();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            refreshCache();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            refreshed = true;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          if (cache.contains(fileName)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>            continue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          if (snapshotsInProgress == null) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>            snapshotsInProgress = getSnapshotsInProgress();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          if (snapshotsInProgress.contains(fileName)) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>            continue;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          unReferencedFiles.add(file);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      } finally {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (lock != null) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          lock.unlock();<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>    return unReferencedFiles;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  private synchronized void refreshCache() throws IOException {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    FileStatus dirStatus;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    try {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    } catch (FileNotFoundException e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      if (this.cache.size() &gt; 0) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // directory was modified, so we need to reload our cache<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // 1. update the modified time<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 2.clear the cache<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.cache.clear();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // 3. check each of the snapshot directories<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    if (snapshots == null) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      // remove all the remembered snapshots because we don't have any left<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      this.snapshots.clear();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return;<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>    // 3.1 iterate through the on-disk snapshots<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    for (FileStatus snapshot : snapshots) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      String name = snapshot.getPath().getName();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      // its not the tmp dir,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        // probably changed.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          // get all files for the snapshot and create a new info<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        // 3.2 add all the files to cache<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        this.cache.addAll(files.getFiles());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        known.put(name, files);<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><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // 4. set the snapshots we are tracking<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    this.snapshots.clear();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    this.snapshots.putAll(known);<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>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  List&lt;String&gt; getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // only add those files to the cache, but not to the known snapshots<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    if (running != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      for (FileStatus run : running) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        try {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        } catch (CorruptedSnapshotException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          // See HBASE-16464<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            // If the snapshot is corrupt, we will delete it<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            fs.delete(run.getPath(), true);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          } else {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            throw e;<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>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return snapshotInProgress;<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>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public class RefreshCacheTask extends TimerTask {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public void run() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        SnapshotFileCache.this.refreshCache();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<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><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public boolean isStopped() {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return this.stop;<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>   * Information about a snapshot directory<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private static class SnapshotDirectoryInfo {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    long lastModified;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    Collection&lt;String&gt; files;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      this.lastModified = mtime;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>     */<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    public Collection&lt;String&gt; getFiles() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      return this.files;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>    /**<a name="line.353"></a>
-<span class="sourceLineNo">354</span>     * Check if the snapshot directory has been modified<a name="line.354"></a>
-<span class="sourceLineNo">355</span>     * @param mtime current modification time of the directory<a name="line.355"></a>
-<span class="sourceLineNo">356</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>     */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    public boolean hasBeenModified(long mtime) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      return this.lastModified &lt; mtime;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>}<a name="line.363"></a>
+<span class="sourceLineNo">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 void stop(String why) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    if (!this.stop) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.stop = true;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.refreshTimer.cancel();<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><a name="line.336"></a>
+<span class="sourceLineNo">337</span>  @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public boolean isStopped() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return this.stop;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * Information about a snapshot directory<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   */<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private static class SnapshotDirectoryInfo {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    long lastModified;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    Collection&lt;String&gt; files;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      this.lastModified = mtime;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>     */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Collection&lt;String&gt; getFiles() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      return this.files;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<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>     * Check if the snapshot directory has been modified<a name="line.362"></a>
+<span class="sourceLineNo">363</span>     * @param mtime current modification time of the directory<a name="line.363"></a>
+<span class="sourceLineNo">364</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>     */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    public boolean hasBeenModified(long mtime) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      return this.lastModified &lt; mtime;<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>}<a name="line.371"></a>
 
 
 


[08/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
index 206b623..796ddc1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
@@ -35,7 +35,7 @@
 <span class="sourceLineNo">027</span>import java.util.Set;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Timer;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.TimerTask;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.locks.ReentrantLock;<a name="line.30"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.locks.Lock;<a name="line.30"></a>
 <span class="sourceLineNo">031</span><a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.fs.FileStatus;<a name="line.33"></a>
@@ -192,183 +192,191 @@
 <span class="sourceLineNo">184</span>    List&lt;FileStatus&gt; unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    List&lt;String&gt; snapshotsInProgress = null;<a name="line.185"></a>
 <span class="sourceLineNo">186</span>    boolean refreshed = false;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    for (FileStatus file : files) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      String fileName = file.getPath().getName();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        refreshCache();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        refreshed = true;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      }<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      if (cache.contains(fileName)) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        continue;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      if (snapshotsInProgress == null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        snapshotsInProgress = getSnapshotsInProgress(snapshotManager);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (snapshotsInProgress.contains(fileName)) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        continue;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      unReferencedFiles.add(file);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    return unReferencedFiles;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>  private synchronized void refreshCache() throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    FileStatus dirStatus;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    try {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    } catch (FileNotFoundException e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (this.cache.size() &gt; 0) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // directory was modified, so we need to reload our cache<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // 1. update the modified time<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 2.clear the cache<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cache.clear();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // 3. check each of the snapshot directories<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (snapshots == null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      // remove all the remembered snapshots because we don't have any left<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      this.snapshots.clear();<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>    // 3.1 iterate through the on-disk snapshots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    for (FileStatus snapshot : snapshots) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      String name = snapshot.getPath().getName();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      // its not the tmp dir,<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        // probably changed.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          // get all files for the snapshot and create a new info<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        // 3.2 add all the files to cache<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        this.cache.addAll(files.getFiles());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        known.put(name, files);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // 4. set the snapshots we are tracking<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.snapshots.clear();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    this.snapshots.putAll(known);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  @VisibleForTesting List&lt;String&gt; getSnapshotsInProgress(<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    final SnapshotManager snapshotManager) throws IOException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // only add those files to the cache, but not to the known snapshots<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    // only add those files to the cache, but not to the known snapshots<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (running != null) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      for (FileStatus run : running) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        ReentrantLock lock = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        if (snapshotManager != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          lock = snapshotManager.getLocks().acquireLock(run.getPath().getName());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        try {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        } catch (CorruptedSnapshotException e) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          // See HBASE-16464<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            // If the snapshot is corrupt, we will delete it<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            fs.delete(run.getPath(), true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            throw e;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } finally {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          if (lock != null) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>            lock.unlock();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return snapshotInProgress;<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>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public class RefreshCacheTask extends TimerTask {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    public void run() {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        SnapshotFileCache.this.refreshCache();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      } catch (IOException e) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<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>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(String why) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!this.stop) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.stop = true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.refreshTimer.cancel();<a name="line.324"></a>
+<span class="sourceLineNo">187</span>    Lock lock = null;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (snapshotManager != null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      lock = snapshotManager.getTakingSnapshotLock().writeLock();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    if (lock == null || lock.tryLock()) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      try {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        if (snapshotManager == null || snapshotManager.isTakingAnySnapshot()) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>          LOG.warn("Not checking unreferenced files since snapshot is running, it will "<a name="line.194"></a>
+<span class="sourceLineNo">195</span>              + "skip to clean the HFiles this time");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>          return unReferencedFiles;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        for (FileStatus file : files) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          String fileName = file.getPath().getName();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            refreshCache();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            refreshed = true;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          if (cache.contains(fileName)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>            continue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          if (snapshotsInProgress == null) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>            snapshotsInProgress = getSnapshotsInProgress();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          if (snapshotsInProgress.contains(fileName)) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>            continue;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          unReferencedFiles.add(file);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      } finally {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (lock != null) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          lock.unlock();<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>    return unReferencedFiles;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  private synchronized void refreshCache() throws IOException {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    FileStatus dirStatus;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    try {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    } catch (FileNotFoundException e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      if (this.cache.size() &gt; 0) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // directory was modified, so we need to reload our cache<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // 1. update the modified time<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 2.clear the cache<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.cache.clear();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // 3. check each of the snapshot directories<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    if (snapshots == null) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      // remove all the remembered snapshots because we don't have any left<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      this.snapshots.clear();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return;<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>    // 3.1 iterate through the on-disk snapshots<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    for (FileStatus snapshot : snapshots) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      String name = snapshot.getPath().getName();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      // its not the tmp dir,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        // probably changed.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          // get all files for the snapshot and create a new info<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        // 3.2 add all the files to cache<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        this.cache.addAll(files.getFiles());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        known.put(name, files);<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><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // 4. set the snapshots we are tracking<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    this.snapshots.clear();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    this.snapshots.putAll(known);<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>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  List&lt;String&gt; getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // only add those files to the cache, but not to the known snapshots<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    if (running != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      for (FileStatus run : running) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        try {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        } catch (CorruptedSnapshotException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          // See HBASE-16464<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            // If the snapshot is corrupt, we will delete it<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            fs.delete(run.getPath(), true);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          } else {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            throw e;<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>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return snapshotInProgress;<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>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public class RefreshCacheTask extends TimerTask {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public void run() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        SnapshotFileCache.this.refreshCache();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<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><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public boolean isStopped() {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return this.stop;<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>   * Information about a snapshot directory<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private static class SnapshotDirectoryInfo {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    long lastModified;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    Collection&lt;String&gt; files;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      this.lastModified = mtime;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>     */<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    public Collection&lt;String&gt; getFiles() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      return this.files;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>    /**<a name="line.353"></a>
-<span class="sourceLineNo">354</span>     * Check if the snapshot directory has been modified<a name="line.354"></a>
-<span class="sourceLineNo">355</span>     * @param mtime current modification time of the directory<a name="line.355"></a>
-<span class="sourceLineNo">356</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>     */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    public boolean hasBeenModified(long mtime) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      return this.lastModified &lt; mtime;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>}<a name="line.363"></a>
+<span class="sourceLineNo">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 void stop(String why) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    if (!this.stop) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.stop = true;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.refreshTimer.cancel();<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><a name="line.336"></a>
+<span class="sourceLineNo">337</span>  @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public boolean isStopped() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return this.stop;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * Information about a snapshot directory<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   */<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private static class SnapshotDirectoryInfo {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    long lastModified;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    Collection&lt;String&gt; files;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      this.lastModified = mtime;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>     */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Collection&lt;String&gt; getFiles() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      return this.files;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<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>     * Check if the snapshot directory has been modified<a name="line.362"></a>
+<span class="sourceLineNo">363</span>     * @param mtime current modification time of the directory<a name="line.363"></a>
+<span class="sourceLineNo">364</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>     */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    public boolean hasBeenModified(long mtime) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      return this.lastModified &lt; mtime;<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>}<a name="line.371"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
index 206b623..796ddc1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
@@ -35,7 +35,7 @@
 <span class="sourceLineNo">027</span>import java.util.Set;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Timer;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.TimerTask;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.concurrent.locks.ReentrantLock;<a name="line.30"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.locks.Lock;<a name="line.30"></a>
 <span class="sourceLineNo">031</span><a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.fs.FileStatus;<a name="line.33"></a>
@@ -192,183 +192,191 @@
 <span class="sourceLineNo">184</span>    List&lt;FileStatus&gt; unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    List&lt;String&gt; snapshotsInProgress = null;<a name="line.185"></a>
 <span class="sourceLineNo">186</span>    boolean refreshed = false;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    for (FileStatus file : files) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      String fileName = file.getPath().getName();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        refreshCache();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        refreshed = true;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      }<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      if (cache.contains(fileName)) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>        continue;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      }<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      if (snapshotsInProgress == null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        snapshotsInProgress = getSnapshotsInProgress(snapshotManager);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      }<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      if (snapshotsInProgress.contains(fileName)) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>        continue;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      unReferencedFiles.add(file);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    return unReferencedFiles;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>  private synchronized void refreshCache() throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    FileStatus dirStatus;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    try {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    } catch (FileNotFoundException e) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (this.cache.size() &gt; 0) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // directory was modified, so we need to reload our cache<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // 1. update the modified time<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 2.clear the cache<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    this.cache.clear();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // 3. check each of the snapshot directories<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    if (snapshots == null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      // remove all the remembered snapshots because we don't have any left<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      this.snapshots.clear();<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>    // 3.1 iterate through the on-disk snapshots<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    for (FileStatus snapshot : snapshots) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      String name = snapshot.getPath().getName();<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      // its not the tmp dir,<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        // probably changed.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          // get all files for the snapshot and create a new info<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        // 3.2 add all the files to cache<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        this.cache.addAll(files.getFiles());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        known.put(name, files);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    // 4. set the snapshots we are tracking<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    this.snapshots.clear();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    this.snapshots.putAll(known);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>  @VisibleForTesting List&lt;String&gt; getSnapshotsInProgress(<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    final SnapshotManager snapshotManager) throws IOException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    // only add those files to the cache, but not to the known snapshots<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    // only add those files to the cache, but not to the known snapshots<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    if (running != null) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      for (FileStatus run : running) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>        ReentrantLock lock = null;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        if (snapshotManager != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>          lock = snapshotManager.getLocks().acquireLock(run.getPath().getName());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        try {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        } catch (CorruptedSnapshotException e) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          // See HBASE-16464<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            // If the snapshot is corrupt, we will delete it<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            fs.delete(run.getPath(), true);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>            throw e;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        } finally {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          if (lock != null) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>            lock.unlock();<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return snapshotInProgress;<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>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public class RefreshCacheTask extends TimerTask {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    public void run() {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      try {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        SnapshotFileCache.this.refreshCache();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      } catch (IOException e) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<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>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(String why) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!this.stop) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      this.stop = true;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      this.refreshTimer.cancel();<a name="line.324"></a>
+<span class="sourceLineNo">187</span>    Lock lock = null;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (snapshotManager != null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      lock = snapshotManager.getTakingSnapshotLock().writeLock();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    if (lock == null || lock.tryLock()) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      try {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        if (snapshotManager == null || snapshotManager.isTakingAnySnapshot()) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>          LOG.warn("Not checking unreferenced files since snapshot is running, it will "<a name="line.194"></a>
+<span class="sourceLineNo">195</span>              + "skip to clean the HFiles this time");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>          return unReferencedFiles;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        for (FileStatus file : files) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          String fileName = file.getPath().getName();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          if (!refreshed &amp;&amp; !cache.contains(fileName)) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>            refreshCache();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            refreshed = true;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>          }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          if (cache.contains(fileName)) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>            continue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          if (snapshotsInProgress == null) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>            snapshotsInProgress = getSnapshotsInProgress();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          if (snapshotsInProgress.contains(fileName)) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>            continue;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          unReferencedFiles.add(file);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      } finally {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (lock != null) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          lock.unlock();<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>    return unReferencedFiles;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  private synchronized void refreshCache() throws IOException {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // get the status of the snapshots directory and check if it is has changes<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    FileStatus dirStatus;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    try {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      dirStatus = fs.getFileStatus(snapshotDir);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    } catch (FileNotFoundException e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      if (this.cache.size() &gt; 0) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        LOG.error("Snapshot directory: " + snapshotDir + " doesn't exist");<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return;<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>    // if the snapshot directory wasn't modified since we last check, we are done<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (dirStatus.getModificationTime() &lt;= this.lastModifiedTime) return;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // directory was modified, so we need to reload our cache<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // there could be a slight race here where we miss the cache, check the directory modification<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // time, then someone updates the directory, causing us to not scan the directory again.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    // However, snapshot directories are only created once, so this isn't an issue.<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>    // 1. update the modified time<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this.lastModifiedTime = dirStatus.getModificationTime();<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 2.clear the cache<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.cache.clear();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    Map&lt;String, SnapshotDirectoryInfo&gt; known = new HashMap&lt;&gt;();<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // 3. check each of the snapshot directories<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    FileStatus[] snapshots = FSUtils.listStatus(fs, snapshotDir);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    if (snapshots == null) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      // remove all the remembered snapshots because we don't have any left<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (LOG.isDebugEnabled() &amp;&amp; this.snapshots.size() &gt; 0) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        LOG.debug("No snapshots on-disk, cache empty");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      this.snapshots.clear();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      return;<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>    // 3.1 iterate through the on-disk snapshots<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    for (FileStatus snapshot : snapshots) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      String name = snapshot.getPath().getName();<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      // its not the tmp dir,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (!name.equals(SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        SnapshotDirectoryInfo files = this.snapshots.remove(name);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        // 3.1.1 if we don't know about the snapshot or its been modified, we need to update the<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        // files the latter could occur where I create a snapshot, then delete it, and then make a<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // new snapshot with the same name. We will need to update the cache the information from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        // that new snapshot, even though it has the same name as the files referenced have<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        // probably changed.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        if (files == null || files.hasBeenModified(snapshot.getModificationTime())) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>          // get all files for the snapshot and create a new info<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          Collection&lt;String&gt; storedFiles = fileInspector.filesUnderSnapshot(snapshot.getPath());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          files = new SnapshotDirectoryInfo(snapshot.getModificationTime(), storedFiles);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        // 3.2 add all the files to cache<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        this.cache.addAll(files.getFiles());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        known.put(name, files);<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><a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // 4. set the snapshots we are tracking<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    this.snapshots.clear();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    this.snapshots.putAll(known);<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>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  List&lt;String&gt; getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    List&lt;String&gt; snapshotInProgress = Lists.newArrayList();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    // only add those files to the cache, but not to the known snapshots<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    Path snapshotTmpDir = new Path(snapshotDir, SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    FileStatus[] running = FSUtils.listStatus(fs, snapshotTmpDir);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    if (running != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      for (FileStatus run : running) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        try {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          snapshotInProgress.addAll(fileInspector.filesUnderSnapshot(run.getPath()));<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        } catch (CorruptedSnapshotException e) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          // See HBASE-16464<a name="line.300"></a>
+<span class="sourceLineNo">301</span>          if (e.getCause() instanceof FileNotFoundException) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            // If the snapshot is corrupt, we will delete it<a name="line.302"></a>
+<span class="sourceLineNo">303</span>            fs.delete(run.getPath(), true);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>            LOG.warn("delete the " + run.getPath() + " due to exception:", e.getCause());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          } else {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>            throw e;<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>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    return snapshotInProgress;<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>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * Simple helper task that just periodically attempts to refresh the cache<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public class RefreshCacheTask extends TimerTask {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    public void run() {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      try {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        SnapshotFileCache.this.refreshCache();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        LOG.warn("Failed to refresh snapshot hfile cache!", e);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<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><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public boolean isStopped() {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return this.stop;<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>   * Information about a snapshot directory<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private static class SnapshotDirectoryInfo {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    long lastModified;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    Collection&lt;String&gt; files;<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      this.lastModified = mtime;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>     */<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    public Collection&lt;String&gt; getFiles() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>      return this.files;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>    /**<a name="line.353"></a>
-<span class="sourceLineNo">354</span>     * Check if the snapshot directory has been modified<a name="line.354"></a>
-<span class="sourceLineNo">355</span>     * @param mtime current modification time of the directory<a name="line.355"></a>
-<span class="sourceLineNo">356</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>     */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    public boolean hasBeenModified(long mtime) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      return this.lastModified &lt; mtime;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>}<a name="line.363"></a>
+<span class="sourceLineNo">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 void stop(String why) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    if (!this.stop) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      this.stop = true;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      this.refreshTimer.cancel();<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><a name="line.336"></a>
+<span class="sourceLineNo">337</span>  @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public boolean isStopped() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return this.stop;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  /**<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   * Information about a snapshot directory<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   */<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private static class SnapshotDirectoryInfo {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    long lastModified;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    Collection&lt;String&gt; files;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>    public SnapshotDirectoryInfo(long mtime, Collection&lt;String&gt; files) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      this.lastModified = mtime;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      this.files = files;<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>     * @return the hfiles in the snapshot when &lt;tt&gt;this&lt;/tt&gt; was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span>     */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    public Collection&lt;String&gt; getFiles() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      return this.files;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    }<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>     * Check if the snapshot directory has been modified<a name="line.362"></a>
+<span class="sourceLineNo">363</span>     * @param mtime current modification time of the directory<a name="line.363"></a>
+<span class="sourceLineNo">364</span>     * @return &lt;tt&gt;true&lt;/tt&gt; if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span>     *         created &lt;tt&gt;this&lt;/tt&gt;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>     */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    public boolean hasBeenModified(long mtime) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      return this.lastModified &lt; mtime;<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>}<a name="line.371"></a>
 
 
 


[02/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 027227a..e6aa23d 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -343,7 +343,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index c8ba6de..05aba80 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -530,7 +530,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 43c98fd..76da548 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -776,7 +776,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 43d1254..aec47d5 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -2194,6 +2194,7 @@
 <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/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestSnapshotWhenChoreCleaning</a></li>
 <li><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotWhileRSCrashes.html" title="class in org.apache.hadoop.hbase.master.snapshot" target="classFrame">TestSnapshotWhileRSCrashes</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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 059d28a..b0ba3fc 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -2194,6 +2194,7 @@
 <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/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></li>
 <li><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotWhileRSCrashes.html" title="class in org.apache.hadoop.hbase.master.snapshot">TestSnapshotWhileRSCrashes</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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/constant-values.html b/testdevapidocs/constant-values.html
index 28a1975..d3d862a 100644
--- a/testdevapidocs/constant-values.html
+++ b/testdevapidocs/constant-values.html
@@ -13706,6 +13706,25 @@
 </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.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</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.snapshot.TestSnapshotWhenChoreCleaning.MAX_SPLIT_KEYS_NUM">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#MAX_SPLIT_KEYS_NUM">MAX_SPLIT_KEYS_NUM</a></code></td>
+<td class="colLast"><code>100</code></td>
+</tr>
+</tbody>
+</table>
+</li>
 </ul>
 <ul class="blockList">
 <li class="blockList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index ae3d656..ca3e9b4 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -6431,6 +6431,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestAcidGuaranteesWithAdaptivePolicy.html" title="class in org.apache.hadoop.hbase">TestAcidGuaranteesWithAdaptivePolicy</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestAcidGuaranteesWithBasicPolicy.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestAcidGuaranteesWithBasicPolicy.html" title="class in org.apache.hadoop.hbase">TestAcidGuaranteesWithBasicPolicy</a></dt>
@@ -8616,6 +8618,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#conf">conf</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#CONF">CONF</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.html#conf">conf</a></span> - Variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList.Generator.GeneratorMapper</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.ContinuousConcurrentWalker.html#conf">conf</a></span> - Variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.ContinuousConcurrentWalker.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList.Generator.GeneratorMapper.ContinuousConcurrentWalker</a></dt>
@@ -10818,6 +10822,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html#createTable--">createTable()</a></span> - 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/snapshot/TestSnapshotWhenChoreCleaning.html#createTable--">createTable()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#createTable-boolean-">createTable(boolean)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#createTable-org.apache.hadoop.hbase.HTableDescriptor-">createTable(HTableDescriptor)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
@@ -14625,6 +14631,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.html#FAMILY">FAMILY</a></span> - Variable 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/snapshot/TestSnapshotWhenChoreCleaning.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html#FAMILY">FAMILY</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestFullLogReconstruction.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestFullLogReconstruction.html" title="class in org.apache.hadoop.hbase">TestFullLogReconstruction</a></dt>
@@ -21630,6 +21638,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/TestHFileSeek.IntegerRange.html#IntegerRange-int-int-">IntegerRange(int, int)</a></span> - Constructor for class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/TestHFileSeek.IntegerRange.html" title="class in org.apache.hadoop.hbase.io.hfile">TestHFileSeek.IntegerRange</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#integerToBytes-int-">integerToBytes(int)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/IntegrationTestAcidGuarantees.html" title="class in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestAcidGuarantees</span></a> - Class in <a href="org/apache/hadoop/hbase/package-summary.html">org.apache.hadoop.hbase</a></dt>
 <dd>
 <div class="block">This Integration Test verifies acid guarantees across column families by frequently writing
@@ -22307,6 +22317,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestActiveMasterManager.WaitToBeMasterThread.html#isActiveMaster">isActiveMaster</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestActiveMasterManager.WaitToBeMasterThread.html" title="class in org.apache.hadoop.hbase.master">TestActiveMasterManager.WaitToBeMasterThread</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#isAnySnapshots-org.apache.hadoop.fs.FileSystem-">isAnySnapshots(FileSystem)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isAutoFlush--">isAutoFlush()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/LoadTestTool.html#isBatchUpdate">isBatchUpdate</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/LoadTestTool.html" title="class in org.apache.hadoop.hbase.util">LoadTestTool</a></dt>
@@ -23503,6 +23515,8 @@
 <dd>
 <div class="block">List all the HFiles in the given table</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#listHFileNames-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">listHFileNames(FileSystem, Path)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHStore.MyList.html#listIterator--">listIterator()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHStore.MyList.html" title="class in org.apache.hadoop.hbase.regionserver">TestHStore.MyList</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHStore.MyList.html#listIterator-int-">listIterator(int)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHStore.MyList.html" title="class in org.apache.hadoop.hbase.regionserver">TestHStore.MyList</a></dt>
@@ -23614,6 +23628,8 @@
 <dd>
 <div class="block">Loads data into the table using the multi-threaded writer.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#loadDataAndFlush--">loadDataAndFlush()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.html#loadDataForPartitionPolicy-org.apache.hadoop.hbase.client.Admin-org.apache.hadoop.hbase.client.BufferedMutator-org.apache.hadoop.hbase.TableName-">loadDataForPartitionPolicy(Admin, BufferedMutator, TableName)</a></span> - Method in class org.apache.hadoop.hbase.mob.compactions.<a href="org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.html" title="class in org.apache.hadoop.hbase.mob.compactions">TestMobCompactor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestReversibleScanners.html#loadDataToRegion-org.apache.hadoop.hbase.regionserver.HRegion-byte:A-">loadDataToRegion(HRegion, byte[])</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestReversibleScanners.html" title="class in org.apache.hadoop.hbase.regionserver">TestReversibleScanners</a></dt>
@@ -24937,6 +24953,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#LOG">LOG</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList.Generator</a></dt>
@@ -25895,6 +25913,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/actions/SplitAllRegionOfTableAction.html#MAX_SPLIT_KEY">MAX_SPLIT_KEY</a></span> - Static variable in class org.apache.hadoop.hbase.chaos.actions.<a href="org/apache/hadoop/hbase/chaos/actions/SplitAllRegionOfTableAction.html" title="class in org.apache.hadoop.hbase.chaos.actions">SplitAllRegionOfTableAction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#MAX_SPLIT_KEYS_NUM">MAX_SPLIT_KEYS_NUM</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/http/TestHttpServer.html#MAX_THREADS">MAX_THREADS</a></span> - Static variable in class org.apache.hadoop.hbase.http.<a href="org/apache/hadoop/hbase/http/TestHttpServer.html" title="class in org.apache.hadoop.hbase.http">TestHttpServer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/client/TestRemoteAdminRetries.html#MAX_TIME">MAX_TIME</a></span> - Static variable in class org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/TestRemoteAdminRetries.html" title="class in org.apache.hadoop.hbase.rest.client">TestRemoteAdminRetries</a></dt>
@@ -32732,6 +32752,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.html#qualifier">qualifier</a></span> - Static variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntryStream</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#QUALIFIER">QUALIFIER</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html#QUALIFIER">QUALIFIER</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html#QUALIFIER">QUALIFIER</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html" title="class in org.apache.hadoop.hbase">TestPartialResultsFromClientSide</a></dt>
@@ -38466,6 +38488,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#setUp--">setUp()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.html#setup-org.apache.hadoop.mapreduce.Mapper.Context-">setup(Mapper&lt;BytesWritable, NullWritable, NullWritable, NullWritable&gt;.Context)</a></span> - Method in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList.Generator.GeneratorMapper</a></dt>
@@ -42343,6 +42367,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessControlFilter.html#TABLE">TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessControlFilter.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessControlFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TABLE">TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html#table">table</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html#TABLE">TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html" title="class in org.apache.hadoop.hbase">TestPartialResultsFromClientSide</a></dt>
@@ -42625,6 +42651,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestFullLogReconstruction.html#TABLE_NAME">TABLE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestFullLogReconstruction.html" title="class in org.apache.hadoop.hbase">TestFullLogReconstruction</a></dt>
@@ -43817,6 +43845,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#tearDown--">tearDown()</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html#tearDown--">tearDown()</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout</a></dt>
@@ -44949,6 +44979,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotClientRetries</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_TABLE">TEST_TABLE</a></span> - Variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALMethods.html#TEST_TABLE">TEST_TABLE</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALMethods.html" title="class in org.apache.hadoop.hbase.wal">TestWALMethods</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithRemove.html#TEST_TABLE1">TEST_TABLE1</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithRemove.html" title="class in org.apache.hadoop.hbase.coprocessor">TestMasterCoprocessorExceptionWithRemove</a></dt>
@@ -45613,6 +45645,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotManifest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClusterPortAssignment.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClusterPortAssignment.html" title="class in org.apache.hadoop.hbase">TestClusterPortAssignment</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestFullLogReconstruction.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestFullLogReconstruction.html" title="class in org.apache.hadoop.hbase">TestFullLogReconstruction</a></dt>
@@ -64066,6 +64100,14 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHdfsSnapshotHRegion.html#testSnapshottingWithTmpSplitsAndMergeDirectoriesPresent--">testSnapshottingWithTmpSplitsAndMergeDirectoriesPresent()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHdfsSnapshotHRegion.html" title="class in org.apache.hadoop.hbase.regionserver">TestHdfsSnapshotHRegion</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">TestSnapshotWhenChoreCleaning</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 Case for HBASE-21387</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TestSnapshotWhenChoreCleaning--">TestSnapshotWhenChoreCleaning()</a></span> - Constructor for class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#testSnapshotWhenSnapshotHFileCleanerRunning--">testSnapshotWhenSnapshotHFileCleanerRunning()</a></span> - Method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotWhileRSCrashes.html" title="class in org.apache.hadoop.hbase.master.snapshot"><span class="typeNameLink">TestSnapshotWhileRSCrashes</span></a> - Class in <a href="org/apache/hadoop/hbase/master/snapshot/package-summary.html">org.apache.hadoop.hbase.master.snapshot</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotWhileRSCrashes.html#TestSnapshotWhileRSCrashes--">TestSnapshotWhileRSCrashes()</a></span> - Constructor for class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotWhileRSCrashes.html" title="class in org.apache.hadoop.hbase.master.snapshot">TestSnapshotWhileRSCrashes</a></dt>
@@ -69477,6 +69519,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/visibility/VisibilityLabelsWithDeletesTestBase.html#value">value</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="org/apache/hadoop/hbase/security/visibility/VisibilityLabelsWithDeletesTestBase.html" title="class in org.apache.hadoop.hbase.security.visibility">VisibilityLabelsWithDeletesTestBase</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#VALUE">VALUE</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot">TestSnapshotWhenChoreCleaning</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html#VALUE">VALUE</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestClientOperationTimeout.html" title="class in org.apache.hadoop.hbase">TestClientOperationTimeout</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html#VALUE">VALUE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html" title="class in org.apache.hadoop.hbase">TestPartialResultsFromClientSide</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 d856cb4..79b923d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -6291,46 +6291,50 @@
 </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">TestSnapshotManifest.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotWhenChoreCleaning.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.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">TestFlushSnapshotFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotManifest.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.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">TestRegionSnapshotTask.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestFlushSnapshotFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.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">TestMobRestoreFlushSnapshotFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestRegionSnapshotTask.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.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">TestSecureExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestMobRestoreFlushSnapshotFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestMobRestoreFlushSnapshotFromClient.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">TestExportSnapshotNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSecureExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSecureExportSnapshot.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">TestExportSnapshotWithTemporaryDirectory.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestExportSnapshotNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshotNoCluster.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">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="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">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="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>
+<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="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>
+</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">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/3353a0ac/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 33bb1b1..01e4f93 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
@@ -4311,25 +4311,29 @@
 </tr>
 <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">TestSnapshotManifest.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotWhenChoreCleaning.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_UTIL">TEST_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">TestRegionSnapshotTask.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotManifest.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
 <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">TestRegionSnapshotTask.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRegionSnapshotTask.html#TEST_UTIL">TEST_UTIL</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"><span class="typeNameLabel">TestExportSnapshot.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestExportSnapshot.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestRestoreFlushSnapshotFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestRestoreFlushSnapshotFromClient.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">TestSnapshotDescriptionUtils.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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">TestFlushSnapshotFromClient.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
index dddaad9..c76d152 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/TestTableName.html
@@ -166,6 +166,10 @@
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestSnapshotClientRetries.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotClientRetries.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TestTableName.html" title="class in org.apache.hadoop.hbase">TestTableName</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestSnapshotWhenChoreCleaning.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index ec56445..4837d80 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,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.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 1add7db..3dce5cf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -579,14 +579,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.<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/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/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/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/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/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/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/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/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/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/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.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/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/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 0673e84..3eea497 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -234,10 +234,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.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</span></a></li>
+<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/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/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</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/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 7c63b00..171508e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -701,11 +701,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/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/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/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>
+<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/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html
index 2d1a6ef..67503a2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/snapshot/TestSnapshotManifest.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li>Next&nbsp;Class</li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.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/TestSnapshotManifest.html" target="_top">Frames</a></li>
@@ -544,7 +544,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/TestSnapshotDescriptionUtils.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li>Next&nbsp;Class</li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.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/TestSnapshotManifest.html" target="_top">Frames</a></li>


[04/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

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


[06/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 f746c7f..bb24e1f 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
@@ -36,1173 +36,1191 @@
 <span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.Set;<a name="line.29"></a>
 <span class="sourceLineNo">030</span>import java.util.concurrent.ThreadPoolExecutor;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.fs.FSDataInputStream;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.FileStatus;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.FileSystem;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.Path;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseInterfaceAudience;<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.MetaTableAccessor;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.Stoppable;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.TableName;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.TableState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.errorhandling.ForeignException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.executor.ExecutorService;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.ipc.RpcServer;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.master.MasterFileSystem;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.master.MetricsMaster;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.master.SnapshotSentinel;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.master.cleaner.HFileCleaner;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.master.cleaner.HFileLinkCleaner;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.master.procedure.CloneSnapshotProcedure;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.master.procedure.RestoreSnapshotProcedure;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.procedure.MasterProcedureManager;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.procedure.Procedure;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.procedure.ProcedureCoordinator;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.procedure.ProcedureCoordinatorRpcs;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.procedure.ZKProcedureCoordinator;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.security.User;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.security.access.AccessChecker;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.snapshot.HBaseSnapshotException;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.snapshot.SnapshotCreationException;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.snapshot.SnapshotExistsException;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifest;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.snapshot.SnapshotReferenceUtil;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.snapshot.TablePartiallyOpenException;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.snapshot.UnknownSnapshotException;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.util.KeyLocker;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.yetus.audience.InterfaceStability;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.zookeeper.KeeperException;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.slf4j.Logger;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.slf4j.LoggerFactory;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameStringPair;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription.Type;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>/**<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * This class manages the procedure of taking and restoring snapshots. There is only one<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * SnapshotManager for the master.<a name="line.95"></a>
-<span class="sourceLineNo">096</span> * &lt;p&gt;<a name="line.96"></a>
-<span class="sourceLineNo">097</span> * The class provides methods for monitoring in-progress snapshot actions.<a name="line.97"></a>
-<span class="sourceLineNo">098</span> * &lt;p&gt;<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * Note: Currently there can only be one snapshot being taken at a time over the cluster. This is a<a name="line.99"></a>
-<span class="sourceLineNo">100</span> * simplification in the current implementation.<a name="line.100"></a>
-<span class="sourceLineNo">101</span> */<a name="line.101"></a>
-<span class="sourceLineNo">102</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.102"></a>
-<span class="sourceLineNo">103</span>@InterfaceStability.Unstable<a name="line.103"></a>
-<span class="sourceLineNo">104</span>public class SnapshotManager extends MasterProcedureManager implements Stoppable {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private static final Logger LOG = LoggerFactory.getLogger(SnapshotManager.class);<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  /** By default, check to see if the snapshot is complete every WAKE MILLIS (ms) */<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  private static final int SNAPSHOT_WAKE_MILLIS_DEFAULT = 500;<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>   * Wait time before removing a finished sentinel from the in-progress map<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   *<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * NOTE: This is used as a safety auto cleanup.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * The snapshot and restore handlers map entries are removed when a user asks if a snapshot or<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * restore is completed. This operation is part of the HBaseAdmin snapshot/restore API flow.<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * In case something fails on the client side and the snapshot/restore state is not reclaimed<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * after a default timeout, the entry is removed from the in-progress map.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * At this point, if the user asks for the snapshot/restore status, the result will be<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * snapshot done if exists or failed if it doesn't exists.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  private static final int SNAPSHOT_SENTINELS_CLEANUP_TIMEOUT = 60 * 1000;<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  /** Enable or disable snapshot support */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String HBASE_SNAPSHOT_ENABLED = "hbase.snapshot.enabled";<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>   * Conf key for # of ms elapsed between checks for snapshot errors while waiting for<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * completion.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private static final String SNAPSHOT_WAKE_MILLIS_KEY = "hbase.snapshot.master.wakeMillis";<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  /** Name of the operation to use in the controller */<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static final String ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION = "online-snapshot";<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  /** Conf key for # of threads used by the SnapshotManager thread pool */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private static final String SNAPSHOT_POOL_THREADS_KEY = "hbase.snapshot.master.threads";<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  /** number of current operations running on the master */<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private static final int SNAPSHOT_POOL_THREADS_DEFAULT = 1;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private boolean stopped;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  private MasterServices master;  // Needed by TableEventHandlers<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private ProcedureCoordinator coordinator;<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  // Is snapshot feature enabled?<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private boolean isSnapshotSupported = false;<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // Snapshot handlers map, with table name as key.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // The map is always accessed and modified under the object lock using synchronized.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  // snapshotTable() will insert an Handler in the table.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  // isSnapshotDone() will remove the handler requested if the operation is finished.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private Map&lt;TableName, SnapshotSentinel&gt; snapshotHandlers = new HashMap&lt;&gt;();<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  // Restore map, with table name as key, procedure ID as value.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  // The map is always accessed and modified under the object lock using synchronized.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  // restoreSnapshot()/cloneSnapshot() will insert a procedure ID in the map.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  //<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  // TODO: just as the Apache HBase 1.x implementation, this map would not survive master<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  // restart/failover. This is just a stopgap implementation until implementation of taking<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  // snapshot using Procedure-V2.<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private Map&lt;TableName, Long&gt; restoreTableToProcIdMap = new HashMap&lt;&gt;();<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  private Path rootDir;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private ExecutorService executorService;<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>   *  Locks for snapshot operations<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   *  key is snapshot's filename in progress, value is the related lock<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *    - create snapshot<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   *    - SnapshotCleaner<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * */<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  private KeyLocker&lt;String&gt; locks = new KeyLocker&lt;&gt;();<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.locks.ReadWriteLock;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.locks.ReentrantReadWriteLock;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.conf.Configuration;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.FSDataInputStream;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.FileStatus;<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.HBaseInterfaceAudience;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HConstants;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.MetaTableAccessor;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.Stoppable;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.TableName;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.TableState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.errorhandling.ForeignException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.executor.ExecutorService;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.ipc.RpcServer;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.master.MasterFileSystem;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.master.MetricsMaster;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.master.SnapshotSentinel;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.master.cleaner.HFileCleaner;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.master.cleaner.HFileLinkCleaner;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.master.procedure.CloneSnapshotProcedure;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.master.procedure.RestoreSnapshotProcedure;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.procedure.MasterProcedureManager;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.procedure.Procedure;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.procedure.ProcedureCoordinator;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.procedure.ProcedureCoordinatorRpcs;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.procedure.ZKProcedureCoordinator;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.security.User;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.security.access.AccessChecker;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.snapshot.HBaseSnapshotException;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.snapshot.RestoreSnapshotException;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.snapshot.SnapshotCreationException;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.snapshot.SnapshotExistsException;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.snapshot.SnapshotManifest;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.snapshot.SnapshotReferenceUtil;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.snapshot.TablePartiallyOpenException;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.snapshot.UnknownSnapshotException;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.yetus.audience.InterfaceStability;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.zookeeper.KeeperException;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.slf4j.Logger;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.slf4j.LoggerFactory;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.NameStringPair;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription.Type;<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> * This class manages the procedure of taking and restoring snapshots. There is only one<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * SnapshotManager for the master.<a name="line.96"></a>
+<span class="sourceLineNo">097</span> * &lt;p&gt;<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * The class provides methods for monitoring in-progress snapshot actions.<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * &lt;p&gt;<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * Note: Currently there can only be one snapshot being taken at a time over the cluster. This is a<a name="line.100"></a>
+<span class="sourceLineNo">101</span> * simplification in the current implementation.<a name="line.101"></a>
+<span class="sourceLineNo">102</span> */<a name="line.102"></a>
+<span class="sourceLineNo">103</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.103"></a>
+<span class="sourceLineNo">104</span>@InterfaceStability.Unstable<a name="line.104"></a>
+<span class="sourceLineNo">105</span>public class SnapshotManager extends MasterProcedureManager implements Stoppable {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private static final Logger LOG = LoggerFactory.getLogger(SnapshotManager.class);<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  /** By default, check to see if the snapshot is complete every WAKE MILLIS (ms) */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private static final int SNAPSHOT_WAKE_MILLIS_DEFAULT = 500;<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>   * Wait time before removing a finished sentinel from the in-progress map<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   *<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * NOTE: This is used as a safety auto cleanup.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * The snapshot and restore handlers map entries are removed when a user asks if a snapshot or<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * restore is completed. This operation is part of the HBaseAdmin snapshot/restore API flow.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * In case something fails on the client side and the snapshot/restore state is not reclaimed<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * after a default timeout, the entry is removed from the in-progress map.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * At this point, if the user asks for the snapshot/restore status, the result will be<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * snapshot done if exists or failed if it doesn't exists.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  private static final int SNAPSHOT_SENTINELS_CLEANUP_TIMEOUT = 60 * 1000;<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  /** Enable or disable snapshot support */<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static final String HBASE_SNAPSHOT_ENABLED = "hbase.snapshot.enabled";<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>   * Conf key for # of ms elapsed between checks for snapshot errors while waiting for<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * completion.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final String SNAPSHOT_WAKE_MILLIS_KEY = "hbase.snapshot.master.wakeMillis";<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  /** Name of the operation to use in the controller */<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public static final String ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION = "online-snapshot";<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /** Conf key for # of threads used by the SnapshotManager thread pool */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private static final String SNAPSHOT_POOL_THREADS_KEY = "hbase.snapshot.master.threads";<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  /** number of current operations running on the master */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private static final int SNAPSHOT_POOL_THREADS_DEFAULT = 1;<a name="line.140"></a>
+<span class="sourceLineNo">141</span><a name="line.141"></a>
+<span class="sourceLineNo">142</span>  private boolean stopped;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private MasterServices master;  // Needed by TableEventHandlers<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  private ProcedureCoordinator coordinator;<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  // Is snapshot feature enabled?<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private boolean isSnapshotSupported = false;<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // Snapshot handlers map, with table name as key.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // The map is always accessed and modified under the object lock using synchronized.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  // snapshotTable() will insert an Handler in the table.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  // isSnapshotDone() will remove the handler requested if the operation is finished.<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private Map&lt;TableName, SnapshotSentinel&gt; snapshotHandlers = new HashMap&lt;&gt;();<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  // Restore map, with table name as key, procedure ID as value.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  // The map is always accessed and modified under the object lock using synchronized.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  // restoreSnapshot()/cloneSnapshot() will insert a procedure ID in the map.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  //<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  // TODO: just as the Apache HBase 1.x implementation, this map would not survive master<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  // restart/failover. This is just a stopgap implementation until implementation of taking<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  // snapshot using Procedure-V2.<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private Map&lt;TableName, Long&gt; restoreTableToProcIdMap = new HashMap&lt;&gt;();<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private Path rootDir;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  private ExecutorService executorService;<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>   * Read write lock between taking snapshot and snapshot HFile cleaner. The cleaner should skip to<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * check the HFiles if any snapshot is in progress, otherwise it may clean a HFile which would<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * belongs to the newly creating snapshot. So we should grab the write lock first when cleaner<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * start to work. (See HBASE-21387)<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private ReentrantReadWriteLock takingSnapshotLock = new ReentrantReadWriteLock(true);<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>  public SnapshotManager() {}<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * Fully specify all necessary components of a snapshot manager. Exposed for testing.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param master services for the master where the manager is running<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * @param coordinator procedure coordinator instance.  exposed for testing.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * @param pool HBase ExecutorServcie instance, exposed for testing.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  public SnapshotManager(final MasterServices master, final MetricsMaster metricsMaster,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      ProcedureCoordinator coordinator, ExecutorService pool)<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      throws IOException, UnsupportedOperationException {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    this.master = master;<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>    this.rootDir = master.getMasterFileSystem().getRootDir();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    checkSnapshotSupport(master.getConfiguration(), master.getMasterFileSystem());<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>    this.coordinator = coordinator;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    this.executorService = pool;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    resetTempDir();<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">197</span>  /**<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * Gets the list of all completed snapshots.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @return list of SnapshotDescriptions<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @throws IOException File system exception<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  public List&lt;SnapshotDescription&gt; getCompletedSnapshots() throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    return getCompletedSnapshots(SnapshotDescriptionUtils.getSnapshotsDir(rootDir), true);<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>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Gets the list of all completed snapshots.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * @param snapshotDir snapshot directory<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * @param withCpCall Whether to call CP hooks<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * @return list of SnapshotDescriptions<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * @throws IOException File system exception<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  private List&lt;SnapshotDescription&gt; getCompletedSnapshots(Path snapshotDir, boolean withCpCall)<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      throws IOException {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    List&lt;SnapshotDescription&gt; snapshotDescs = new ArrayList&lt;&gt;();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    // first create the snapshot root path and check to see if it exists<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    if (snapshotDir == null) snapshotDir = SnapshotDescriptionUtils.getSnapshotsDir(rootDir);<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>    // if there are no snapshots, return an empty list<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    if (!fs.exists(snapshotDir)) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return snapshotDescs;<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>    // ignore all the snapshots in progress<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    FileStatus[] snapshots = fs.listStatus(snapshotDir,<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      new SnapshotDescriptionUtils.CompletedSnaphotDirectoriesFilter(fs));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    withCpCall = withCpCall &amp;&amp; cpHost != null;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // loop through all the completed snapshots<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    for (FileStatus snapshot : snapshots) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      Path info = new Path(snapshot.getPath(), SnapshotDescriptionUtils.SNAPSHOTINFO_FILE);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // if the snapshot is bad<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      if (!fs.exists(info)) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        LOG.error("Snapshot information for " + snapshot.getPath() + " doesn't exist");<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        continue;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      FSDataInputStream in = null;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        in = fs.open(info);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        SnapshotDescription desc = SnapshotDescription.parseFrom(in);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        org.apache.hadoop.hbase.client.SnapshotDescription descPOJO = (withCpCall)<a name="line.242"></a>
-<span class="sourceLineNo">243</span>            ? ProtobufUtil.createSnapshotDesc(desc) : null;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        if (withCpCall) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          try {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>            cpHost.preListSnapshot(descPOJO);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>          } catch (AccessDeniedException e) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>            LOG.warn("Current user does not have access to " + desc.getName() + " snapshot. "<a name="line.248"></a>
-<span class="sourceLineNo">249</span>                + "Either you should be owner of this snapshot or admin user.");<a name="line.249"></a>
-<span class="sourceLineNo">250</span>            // Skip this and try for next snapshot<a name="line.250"></a>
-<span class="sourceLineNo">251</span>            continue;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        snapshotDescs.add(desc);<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>        // call coproc post hook<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        if (withCpCall) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          cpHost.postListSnapshot(descPOJO);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      } catch (IOException e) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        LOG.warn("Found a corrupted snapshot " + snapshot.getPath(), e);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      } finally {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        if (in != null) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          in.close();<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>    return snapshotDescs;<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>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Cleans up any snapshots in the snapshot/.tmp directory that were left from failed<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * snapshot attempts.<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   *<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * @throws IOException if we can't reach the filesystem<a name="line.275"></a>
-<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>        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>
-<span class="sourceLineNo">287</span>  /**<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * Delete the specified snapshot<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @param snapshot<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   * @throws SnapshotDoesNotExistException If the specified snapshot does not exist.<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   * @throws IOException For filesystem IOExceptions<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   */<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  public void deleteSnapshot(SnapshotDescription snapshot) throws SnapshotDoesNotExistException, IOException {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    // check to see if it is completed<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    if (!isSnapshotCompleted(snapshot)) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      throw new SnapshotDoesNotExistException(ProtobufUtil.createSnapshotDesc(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>    String snapshotName = snapshot.getName();<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    // first create the snapshot description and check to see if it exists<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, rootDir);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // Get snapshot info from file system. The one passed as parameter is a "fake" snapshotInfo with<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // just the "name" and it does not contains the "real" snapshot information<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    snapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // call coproc pre hook<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (cpHost != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      cpHost.preDeleteSnapshot(snapshotPOJO);<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>    LOG.debug("Deleting snapshot: " + snapshotName);<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    // delete the existing snapshot<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    if (!fs.delete(snapshotDir, true)) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throw new HBaseSnapshotException("Failed to delete snapshot directory: " + snapshotDir);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // call coproc post hook<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (cpHost != null) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      cpHost.postDeleteSnapshot(snapshotPOJO);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<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>  /**<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * Check if the specified snapshot is done<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   *<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @param expected<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * @return true if snapshot is ready to be restored, false if it is still being taken.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * @throws IOException IOException if error from HDFS or RPC<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @throws UnknownSnapshotException if snapshot is invalid or does not exist.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public boolean isSnapshotDone(SnapshotDescription expected) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    // check the request to make sure it has a snapshot<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    if (expected == null) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      throw new UnknownSnapshotException(<a name="line.339"></a>
-<span class="sourceLineNo">340</span>         "No snapshot name passed in request, can't figure out which snapshot you want to check.");<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>    String ssString = ClientSnapshotDescriptionUtils.toString(expected);<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>    // check to see if the sentinel exists,<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // and if the task is complete removes it from the in-progress snapshots map.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    SnapshotSentinel handler = removeSentinelIfFinished(this.snapshotHandlers, expected);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // stop tracking "abandoned" handlers<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    cleanupSentinels();<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>    if (handler == null) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      // If there's no handler in the in-progress map, it means one of the following:<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      //   - someone has already requested the snapshot state<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      //   - the requested snapshot was completed long time ago (cleanupSentinels() timeout)<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      //   - the snapshot was never requested<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      // In those cases returns to the user the "done state" if the snapshots exists on disk,<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      // otherwise raise an exception saying that the snapshot is not running and doesn't exist.<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      if (!isSnapshotCompleted(expected)) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        throw new UnknownSnapshotException("Snapshot " + ssString<a name="line.360"></a>
-<span class="sourceLineNo">361</span>            + " is not currently running or one of the known completed snapshots.");<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      // was done, return true;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      return 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>    // pass on any failure we find in the sentinel<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    try {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      handler.rethrowExceptionIfFailed();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    } catch (ForeignException e) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      // Give some procedure info on an exception.<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      String status;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      Procedure p = coordinator.getProcedure(expected.getName());<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      if (p != null) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        status = p.getStatus();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        status = expected.getName() + " not found in proclist " + coordinator.getProcedureNames();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new HBaseSnapshotException("Snapshot " + ssString +  " had an error.  " + status, e,<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        ProtobufUtil.createSnapshotDesc(expected));<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>    // check to see if we are done<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    if (handler.isFinished()) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      LOG.debug("Snapshot '" + ssString + "' has completed, notifying client.");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      return true;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    } else if (LOG.isDebugEnabled()) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      LOG.debug("Snapshoting '" + ssString + "' is still in progress!");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    return false;<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>  /**<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   * Check to see if there is a snapshot in progress with the same name or on the same table.<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Currently we have a limitation only allowing a single snapshot per table at a time. Also we<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * don't allow snapshot with the same name.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * @param snapshot description of the snapshot being checked.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if there is a snapshot in progress with the same name or on the same<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   *         table.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   */<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  synchronized boolean isTakingSnapshot(final SnapshotDescription snapshot) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    TableName snapshotTable = TableName.valueOf(snapshot.getTable());<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    if (isTakingSnapshot(snapshotTable)) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      return true;<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    Iterator&lt;Map.Entry&lt;TableName, SnapshotSentinel&gt;&gt; it = this.snapshotHandlers.entrySet().iterator();<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    while (it.hasNext()) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      Map.Entry&lt;TableName, SnapshotSentinel&gt; entry = it.next();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      SnapshotSentinel sentinel = entry.getValue();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      if (snapshot.getName().equals(sentinel.getSnapshot().getName()) &amp;&amp; !sentinel.isFinished()) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        return true;<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>    return false;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  }<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>   * Check to see if the specified table has a snapshot in progress.  Currently we have a<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * limitation only allowing a single snapshot per table at a time.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param tableName name of the table being snapshotted.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if there is a snapshot in progress on the specified table.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   */<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  public synchronized boolean isTakingSnapshot(final TableName tableName) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    SnapshotSentinel handler = this.snapshotHandlers.get(tableName);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    return handler != null &amp;&amp; !handler.isFinished();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  }<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  /**<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Check to make sure that we are OK to run the passed snapshot. Checks to make sure that we<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * aren't already running a snapshot or restore on the requested table.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * @param snapshot description of the snapshot we want to start<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * @throws HBaseSnapshotException if the filesystem could not be prepared to start the snapshot<a name="line.432"></a>
-<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>    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>
-<span class="sourceLineNo">441</span>    // make sure we aren't already running a snapshot<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    if (isTakingSnapshot(snapshot)) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      SnapshotSentinel handler = this.snapshotHandlers.get(snapshotTable);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      throw new SnapshotCreationException("Rejected taking "<a name="line.444"></a>
-<span class="sourceLineNo">445</span>          + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          + " because we are already running another snapshot "<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          + (handler != null ? ("on the same table " +<a name="line.447"></a>
-<span class="sourceLineNo">448</span>              ClientSnapshotDescriptionUtils.toString(handler.getSnapshot()))<a name="line.448"></a>
-<span class="sourceLineNo">449</span>              : "with the same name"), ProtobufUtil.createSnapshotDesc(snapshot));<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>    // make sure we aren't running a restore on the same table<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    if (isRestoringTable(snapshotTable)) {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      throw new SnapshotCreationException("Rejected taking "<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          + ClientSnapshotDescriptionUtils.toString(snapshot)<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          + " because we are already have a restore in progress on the same snapshot.");<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>    try {<a name="line.459"></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>
-<span class="sourceLineNo">472</span>    } catch (IOException e) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      throw new SnapshotCreationException(<a name="line.473"></a>
-<span class="sourceLineNo">474</span>          "Exception while checking to see if snapshot could be started.", e,<a name="line.474"></a>
-<span class="sourceLineNo">475</span>          ProtobufUtil.createSnapshotDesc(snapshot));<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<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 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">175</span>  public SnapshotManager() {}<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>   * Fully specify all necessary components of a snapshot manager. Exposed for testing.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @param master services for the master where the manager is running<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param coordinator procedure coordinator instance.  exposed for testing.<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param pool HBase ExecutorServcie instance, exposed for testing.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   */<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  public SnapshotManager(final MasterServices master, final MetricsMaster metricsMaster,<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      ProcedureCoordinator coordinator, ExecutorService pool)<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      throws IOException, UnsupportedOperationException {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    this.master = master;<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    this.rootDir = master.getMasterFileSystem().getRootDir();<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    checkSnapshotSupport(master.getConfiguration(), master.getMasterFileSystem());<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>    this.coordinator = coordinator;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    this.executorService = pool;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    resetTempDir();<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>  /**<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * Gets the list of all completed snapshots.<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @return list of SnapshotDescriptions<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @throws IOException File system exception<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  public List&lt;SnapshotDescription&gt; getCompletedSnapshots() throws IOException {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    return getCompletedSnapshots(SnapshotDescriptionUtils.getSnapshotsDir(rootDir), true);<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>   * Gets the list of all completed snapshots.<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * @param snapshotDir snapshot directory<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * @param withCpCall Whether to call CP hooks<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @return list of SnapshotDescriptions<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * @throws IOException File system exception<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  private List&lt;SnapshotDescription&gt; getCompletedSnapshots(Path snapshotDir, boolean withCpCall)<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      throws IOException {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    List&lt;SnapshotDescription&gt; snapshotDescs = new ArrayList&lt;&gt;();<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    // first create the snapshot root path and check to see if it exists<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    if (snapshotDir == null) snapshotDir = SnapshotDescriptionUtils.getSnapshotsDir(rootDir);<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    // if there are no snapshots, return an empty list<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    if (!fs.exists(snapshotDir)) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      return snapshotDescs;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // ignore all the snapshots in progress<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    FileStatus[] snapshots = fs.listStatus(snapshotDir,<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      new SnapshotDescriptionUtils.CompletedSnaphotDirectoriesFilter(fs));<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    withCpCall = withCpCall &amp;&amp; cpHost != null;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    // loop through all the completed snapshots<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    for (FileStatus snapshot : snapshots) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      Path info = new Path(snapshot.getPath(), SnapshotDescriptionUtils.SNAPSHOTINFO_FILE);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      // if the snapshot is bad<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      if (!fs.exists(info)) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        LOG.error("Snapshot information for " + snapshot.getPath() + " doesn't exist");<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        continue;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      FSDataInputStream in = null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      try {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        in = fs.open(info);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        SnapshotDescription desc = SnapshotDescription.parseFrom(in);<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        org.apache.hadoop.hbase.client.SnapshotDescription descPOJO = (withCpCall)<a name="line.241"></a>
+<span class="sourceLineNo">242</span>            ? ProtobufUtil.createSnapshotDesc(desc) : null;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        if (withCpCall) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>          try {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>            cpHost.preListSnapshot(descPOJO);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          } catch (AccessDeniedException e) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>            LOG.warn("Current user does not have access to " + desc.getName() + " snapshot. "<a name="line.247"></a>
+<span class="sourceLineNo">248</span>                + "Either you should be owner of this snapshot or admin user.");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>            // Skip this and try for next snapshot<a name="line.249"></a>
+<span class="sourceLineNo">250</span>            continue;<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>        snapshotDescs.add(desc);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>        // call coproc post hook<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        if (withCpCall) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          cpHost.postListSnapshot(descPOJO);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      } catch (IOException e) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        LOG.warn("Found a corrupted snapshot " + snapshot.getPath(), e);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      } finally {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        if (in != null) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          in.close();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return snapshotDescs;<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>   * Cleans up any snapshots in the snapshot/.tmp directory that were left from failed<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * snapshot attempts.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   *<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @throws IOException if we can't reach the filesystem<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  void resetTempDir() throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    // cleanup any existing snapshots.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Path tmpdir = SnapshotDescriptionUtils.getWorkingSnapshotDir(rootDir,<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        master.getConfiguration());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    FileSystem tmpFs = tmpdir.getFileSystem(master.getConfiguration());<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    if (!tmpFs.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">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>
+<span class="sourceLineNo">287</span>   * Delete the specified snapshot<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param snapshot<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @throws SnapshotDoesNotExistException If the specified snapshot does not exist.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @throws IOException For filesystem IOExceptions<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  public void deleteSnapshot(SnapshotDescription snapshot) throws SnapshotDoesNotExistException, IOException {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    // check to see if it is completed<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (!isSnapshotCompleted(snapshot)) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      throw new SnapshotDoesNotExistException(ProtobufUtil.createSnapshotDesc(snapshot));<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>    String snapshotName = snapshot.getName();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    // first create the snapshot description and check to see if it exists<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    FileSystem fs = master.getMasterFileSystem().getFileSystem();<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    Path snapshotDir = SnapshotDescriptionUtils.getCompletedSnapshotDir(snapshotName, rootDir);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // Get snapshot info from file system. The one passed as parameter is a "fake" snapshotInfo with<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // just the "name" and it does not contains the "real" snapshot information<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    snapshot = SnapshotDescriptionUtils.readSnapshotInfo(fs, snapshotDir);<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // call coproc pre hook<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    MasterCoprocessorHost cpHost = master.getMasterCoprocessorHost();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    org.apache.hadoop.hbase.client.SnapshotDescription snapshotPOJO = null;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (cpHost != null) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      snapshotPOJO = ProtobufUtil.createSnapshotDesc(snapshot);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      cpHost.preDeleteSnapshot(snapshotPOJO);<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>    LOG.debug("Deleting snapshot: " + snapshotName);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    // delete the existing snapshot<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    if (!fs.delete(snapshotDir, true)) {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      throw new HBaseSnapshotException("Failed to delete snapshot directory: " + snapshotDir);<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>    // call coproc post hook<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    if (cpHost != null) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      cpHost.postDeleteSnapshot(snapshotPOJO);<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>  }<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>   * Check if the specified snapshot is done<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param expected<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * @return true if snapshot is ready to be restored, false if it is still being taken.<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * @throws IOException IOException if error from HDFS or RPC<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * @throws UnknownSnapshotException if snapshot is invalid or does not exist.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  public boolean isSnapshotDone(SnapshotDescription expected) throws IOException {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    // check the request to make sure it has a snapshot<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    if (expected == null) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      throw new Unkno

<TRUNCATED>

[03/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 5ec8a45..cd52d30 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -461,7 +461,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index b718e6e..8340c5b 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -341,7 +341,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 8c9825e..9450a30 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -421,7 +421,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index f62b6eb..4aae16e 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -301,7 +301,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 60cd1fa..7acbc21 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -298,7 +298,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index ab4a29d..c6f0166 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -501,7 +501,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 5e60ec9..9dd8201 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -351,7 +351,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index fcfd43e..4d88112 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -469,7 +469,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 20487f5..4b9c6ae 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -450,7 +450,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 6c823bf..98cd0f0 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -450,7 +450,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 7ef6f28..b004e42 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -381,7 +381,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index c8c4378..0f5d067 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -779,7 +779,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 8e6866a..761f1f9 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -345,7 +345,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index cd7d9d5..cc98a59 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -315,7 +315,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 2c0041a..94c2c4d 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 2d4a02f..11ec627 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -318,7 +318,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 52229e0..fe65afe 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -313,7 +313,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 71b16aa..5db8f8c 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -341,7 +341,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index a2fb6cc..2fb1ba6 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -309,7 +309,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 


[10/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 b3b924c..8b4d7eb 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.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,"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 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,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -125,7 +125,7 @@ var activeTableTab = "activeTableTab";
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Configuration")
  @InterfaceStability.Unstable
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.104">SnapshotManager</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.105">SnapshotManager</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManager.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManager</a>
 implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></pre>
 <div class="block">This class manages the procedure of taking and restoring snapshots. There is only one
@@ -172,49 +172,40 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#isSnapshotSupported">isSnapshotSupported</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private <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;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#locks">locks</a></span></code>
-<div class="block">Locks for snapshot operations
-  key is snapshot's filename in progress, value is the related lock
-    - create snapshot
-    - SnapshotCleaner</div>
-</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/SnapshotManager.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<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/SnapshotManager.html#master">master</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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/master/snapshot/SnapshotManager.html#ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION">ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION</a></span></code>
 <div class="block">Name of the operation to use in the controller</div>
 </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/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="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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#restoreTableToProcIdMap">restoreTableToProcIdMap</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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/SnapshotManager.html#rootDir">rootDir</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/master/snapshot/SnapshotManager.html#SNAPSHOT_POOL_THREADS_DEFAULT">SNAPSHOT_POOL_THREADS_DEFAULT</a></span></code>
 <div class="block">number of current operations running on the master</div>
 </td>
 </tr>
-<tr class="rowColor">
+<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/master/snapshot/SnapshotManager.html#SNAPSHOT_POOL_THREADS_KEY">SNAPSHOT_POOL_THREADS_KEY</a></span></code>
 <div class="block">Conf key for # of threads used by the SnapshotManager thread pool</div>
 </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/master/snapshot/SnapshotManager.html#SNAPSHOT_SENTINELS_CLEANUP_TIMEOUT">SNAPSHOT_SENTINELS_CLEANUP_TIMEOUT</a></span></code>
 <div class="block">Wait time before removing a finished sentinel from the in-progress map
@@ -222,27 +213,33 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
  NOTE: This is used as a safety auto cleanup.</div>
 </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/master/snapshot/SnapshotManager.html#SNAPSHOT_WAKE_MILLIS_DEFAULT">SNAPSHOT_WAKE_MILLIS_DEFAULT</a></span></code>
 <div class="block">By default, check to see if the snapshot is complete every WAKE MILLIS (ms)</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <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/master/snapshot/SnapshotManager.html#SNAPSHOT_WAKE_MILLIS_KEY">SNAPSHOT_WAKE_MILLIS_KEY</a></span></code>
 <div class="block">Conf key for # of ms elapsed between checks for snapshot errors while waiting for
  completion.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#snapshotHandlers">snapshotHandlers</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#stopped">stopped</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#takingSnapshotLock">takingSnapshotLock</a></span></code>
+<div class="block">Read write lock between taking snapshot and snapshot HFile cleaner.</div>
+</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -374,15 +371,15 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getCoordinator--">getCoordinator</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i13" class="rowColor">
-<td class="colFirst"><code><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;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getLocks--">getLocks</a></span>()</code>&nbsp;</td>
-</tr>
-<tr id="i14" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getProcedureSignature--">getProcedureSignature</a></span>()</code>
 <div class="block">Return the unique signature of the procedure.</div>
 </td>
 </tr>
+<tr id="i14" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getTakingSnapshotLock--">getTakingSnapshotLock</a></span>()</code>&nbsp;</td>
+</tr>
 <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/master/snapshot/SnapshotManager.html#initialize-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.master.MetricsMaster-">initialize</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,
@@ -420,38 +417,45 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#isStopped--">isStopped</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i21" class="rowColor">
+<td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#isTakingAnySnapshot--">isTakingAnySnapshot</a></span>()</code>
+<div class="block">The snapshot operation processing as following: <br>
+ 1.</div>
+</td>
+</tr>
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#isTakingSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">isTakingSnapshot</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</code>
 <div class="block">Check to see if there is a snapshot in progress with the same name or on the same table.</div>
 </td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#isTakingSnapshot-org.apache.hadoop.hbase.TableName-">isTakingSnapshot</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Check to see if the specified table has a snapshot in progress.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#prepareToTakeSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">prepareToTakeSnapshot</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</code>
 <div class="block">Check to make sure that we are OK to run the passed snapshot.</div>
 </td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#removeSentinelIfFinished-java.util.Map-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">removeSentinelIfFinished</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/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)</code>
 <div class="block">Return the handler if it is currently live and has the same snapshot target name.</div>
 </td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#resetTempDir--">resetTempDir</a></span>()</code>
 <div class="block">Cleans up any snapshots in the snapshot/.tmp directory that were left from failed
  snapshot attempts.</div>
 </td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#restoreOrCloneSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.util.NonceKey-boolean-">restoreOrCloneSnapshot</a></span>(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,
@@ -459,7 +463,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <div class="block">Restore or Clone the specified snapshot</div>
 </td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#restoreSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-org.apache.hadoop.hbase.util.NonceKey-boolean-">restoreSnapshot</a></span>(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,
@@ -468,7 +472,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <div class="block">Restore the specified snapshot.</div>
 </td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#restoreSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.client.TableDescriptor-org.apache.hadoop.hbase.util.NonceKey-boolean-">restoreSnapshot</a></span>(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,
@@ -479,45 +483,49 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <div class="block">Restore the specified snapshot.</div>
 </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/master/snapshot/SnapshotManager.html#setSnapshotHandlerForTesting-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.master.SnapshotSentinel-">setSnapshotHandlerForTesting</a></span>(<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)</code>
 <div class="block">Set the handler for the current snapshot</div>
 </td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><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 id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><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 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/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>
-<tr id="i33" class="rowColor">
+<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/master/snapshot/SnapshotManager.html#stop-java.lang.String-">stop</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;why)</code>
 <div class="block">Stop this service.</div>
 </td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#takeSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">takeSnapshot</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</code>
 <div class="block">Take a snapshot based on the enabled/disabled state of the table.</div>
 </td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#takeSnapshotInternal-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">takeSnapshotInternal</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</code>&nbsp;</td>
+</tr>
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>private 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/SnapshotManager.html#toSnapshotDescription-org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription-">toSnapshotDescription</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription&nbsp;desc)</code>&nbsp;</td>
 </tr>
@@ -563,7 +571,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <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/SnapshotManager.html#line.105">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.106">LOG</a></pre>
 </li>
 </ul>
 <a name="SNAPSHOT_WAKE_MILLIS_DEFAULT">
@@ -572,7 +580,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_WAKE_MILLIS_DEFAULT</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.108">SNAPSHOT_WAKE_MILLIS_DEFAULT</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.109">SNAPSHOT_WAKE_MILLIS_DEFAULT</a></pre>
 <div class="block">By default, check to see if the snapshot is complete every WAKE MILLIS (ms)</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -586,7 +594,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_SENTINELS_CLEANUP_TIMEOUT</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.121">SNAPSHOT_SENTINELS_CLEANUP_TIMEOUT</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.122">SNAPSHOT_SENTINELS_CLEANUP_TIMEOUT</a></pre>
 <div class="block">Wait time before removing a finished sentinel from the in-progress map
 
  NOTE: This is used as a safety auto cleanup.
@@ -608,7 +616,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_SNAPSHOT_ENABLED</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/master/snapshot/SnapshotManager.html#line.124">HBASE_SNAPSHOT_ENABLED</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/master/snapshot/SnapshotManager.html#line.125">HBASE_SNAPSHOT_ENABLED</a></pre>
 <div class="block">Enable or disable snapshot support</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -622,7 +630,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_WAKE_MILLIS_KEY</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/master/snapshot/SnapshotManager.html#line.130">SNAPSHOT_WAKE_MILLIS_KEY</a></pre>
+<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/master/snapshot/SnapshotManager.html#line.131">SNAPSHOT_WAKE_MILLIS_KEY</a></pre>
 <div class="block">Conf key for # of ms elapsed between checks for snapshot errors while waiting for
  completion.</div>
 <dl>
@@ -637,7 +645,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION</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/master/snapshot/SnapshotManager.html#line.133">ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION</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/master/snapshot/SnapshotManager.html#line.134">ONLINE_SNAPSHOT_CONTROLLER_DESCRIPTION</a></pre>
 <div class="block">Name of the operation to use in the controller</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -651,7 +659,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_POOL_THREADS_KEY</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/master/snapshot/SnapshotManager.html#line.136">SNAPSHOT_POOL_THREADS_KEY</a></pre>
+<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/master/snapshot/SnapshotManager.html#line.137">SNAPSHOT_POOL_THREADS_KEY</a></pre>
 <div class="block">Conf key for # of threads used by the SnapshotManager thread pool</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -665,7 +673,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>SNAPSHOT_POOL_THREADS_DEFAULT</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.139">SNAPSHOT_POOL_THREADS_DEFAULT</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.140">SNAPSHOT_POOL_THREADS_DEFAULT</a></pre>
 <div class="block">number of current operations running on the master</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -679,7 +687,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>stopped</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.141">stopped</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.142">stopped</a></pre>
 </li>
 </ul>
 <a name="master">
@@ -688,7 +696,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>master</h4>
-<pre>private&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/SnapshotManager.html#line.142">master</a></pre>
+<pre>private&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/SnapshotManager.html#line.143">master</a></pre>
 </li>
 </ul>
 <a name="coordinator">
@@ -697,7 +705,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>coordinator</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure/ProcedureCoordinator.html" title="class in org.apache.hadoop.hbase.procedure">ProcedureCoordinator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.143">coordinator</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure/ProcedureCoordinator.html" title="class in org.apache.hadoop.hbase.procedure">ProcedureCoordinator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.144">coordinator</a></pre>
 </li>
 </ul>
 <a name="isSnapshotSupported">
@@ -706,7 +714,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isSnapshotSupported</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.146">isSnapshotSupported</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.147">isSnapshotSupported</a></pre>
 </li>
 </ul>
 <a name="snapshotHandlers">
@@ -715,7 +723,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotHandlers</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.152">snapshotHandlers</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.153">snapshotHandlers</a></pre>
 </li>
 </ul>
 <a name="restoreTableToProcIdMap">
@@ -724,7 +732,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreTableToProcIdMap</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.161">restoreTableToProcIdMap</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.162">restoreTableToProcIdMap</a></pre>
 </li>
 </ul>
 <a name="rootDir">
@@ -733,7 +741,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <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/SnapshotManager.html#line.163">rootDir</a></pre>
+<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.164">rootDir</a></pre>
 </li>
 </ul>
 <a name="executorService">
@@ -742,20 +750,20 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>executorService</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/executor/ExecutorService.html" title="class in org.apache.hadoop.hbase.executor">ExecutorService</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.164">executorService</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/executor/ExecutorService.html" title="class in org.apache.hadoop.hbase.executor">ExecutorService</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.165">executorService</a></pre>
 </li>
 </ul>
-<a name="locks">
+<a name="takingSnapshotLock">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>locks</h4>
-<pre>private&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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.172">locks</a></pre>
-<div class="block">Locks for snapshot operations
-  key is snapshot's filename in progress, value is the related lock
-    - create snapshot
-    - SnapshotCleaner</div>
+<h4>takingSnapshotLock</h4>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.173">takingSnapshotLock</a></pre>
+<div class="block">Read write lock between taking snapshot and snapshot HFile cleaner. The cleaner should skip to
+ check the HFiles if any snapshot is in progress, otherwise it may clean a HFile which would
+ belongs to the newly creating snapshot. So we should grab the write lock first when cleaner
+ start to work. (See HBASE-21387)</div>
 </li>
 </ul>
 </li>
@@ -772,7 +780,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>SnapshotManager</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.176">SnapshotManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.175">SnapshotManager</a>()</pre>
 </li>
 </ul>
 <a name="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-">
@@ -781,7 +789,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SnapshotManager</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.184">SnapshotManager</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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.183">SnapshotManager</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,
                        <a href="../../../../../../org/apache/hadoop/hbase/procedure/ProcedureCoordinator.html" title="class in org.apache.hadoop.hbase.procedure">ProcedureCoordinator</a>&nbsp;coordinator,
                        <a href="../../../../../../org/apache/hadoop/hbase/executor/ExecutorService.html" title="class in org.apache.hadoop.hbase.executor">ExecutorService</a>&nbsp;pool)
@@ -813,7 +821,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompletedSnapshots</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.SnapshotDescription&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.202">getCompletedSnapshots</a>()
+<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.SnapshotDescription&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.201">getCompletedSnapshots</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">Gets the list of all completed snapshots.</div>
 <dl>
@@ -830,7 +838,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompletedSnapshots</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.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.213">getCompletedSnapshots</a>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
+<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.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.212">getCompletedSnapshots</a>(org.apache.hadoop.fs.Path&nbsp;snapshotDir,
                                                                                                                          boolean&nbsp;withCpCall)
                                                                                                                   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">Gets the list of all completed snapshots.</div>
@@ -851,7 +859,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>resetTempDir</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.277">resetTempDir</a>()
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.276">resetTempDir</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">Cleans up any snapshots in the snapshot/.tmp directory that were left from failed
  snapshot attempts.</div>
@@ -867,7 +875,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.293">deleteSnapshot</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.292">deleteSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)
                     throws <a href="../../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDoesNotExistException.html" title="class in org.apache.hadoop.hbase.snapshot">SnapshotDoesNotExistException</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">Delete the specified snapshot</div>
@@ -886,7 +894,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isSnapshotDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.336">isSnapshotDone</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;expected)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.335">isSnapshotDone</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;expected)
                        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 if the specified snapshot is done</div>
 <dl>
@@ -906,7 +914,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isTakingSnapshot</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.401">isTakingSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.400">isTakingSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription&nbsp;snapshot)</pre>
 <div class="block">Check to see if there is a snapshot in progress with the same name or on the same table.
  Currently we have a limitation only allowing a single snapshot per table at a time. Also we
  don't allow snapshot with the same name.</div>
@@ -925,7 +933,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>isTakingSnapshot</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.423">isTakingSnapshot</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.422">isTakingSnapshot</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block">Check to see if the specified table has a snapshot in progress.  Currently we have a
  limitation only allowing a single snapshot per table at a time.</div>
 <dl>
@@ -942,7 +950,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareToTakeSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.434">prepareToTakeSnapshot</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.433">prepareToTakeSnapshot</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>
 <div class="block">Check to make sure that we are OK to run the passed snapshot. Checks to make sure that we
  aren't already running a snapshot or restore on the requested table.</div>
@@ -960,7 +968,7 @@ 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.485">snapshotDisabledTable</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.484">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>
@@ -978,7 +986,7 @@ 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.505">snapshotEnabledTable</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.504">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>
@@ -996,7 +1004,7 @@ 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.524">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.523">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="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.
@@ -1012,13 +1020,40 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 </dl>
 </li>
 </ul>
+<a name="getTakingSnapshotLock--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getTakingSnapshotLock</h4>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.549">getTakingSnapshotLock</a>()</pre>
+</li>
+</ul>
+<a name="isTakingAnySnapshot--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>isTakingAnySnapshot</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.561">isTakingAnySnapshot</a>()</pre>
+<div class="block">The snapshot operation processing as following: <br>
+ 1. Create a Snapshot Handler, and do some initialization; <br>
+ 2. Put the handler into snapshotHandlers <br>
+ So when we consider if any snapshot is taking, we should consider both the takingSnapshotLock
+ and snapshotHandlers;</div>
+<dl>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>true to indicate that there're some running snapshots.</dd>
+</dl>
+</li>
+</ul>
 <a name="takeSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">
 <!--   -->
 </a>
 <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.557">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.571">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>
@@ -1030,13 +1065,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 </dl>
 </li>
 </ul>
+<a name="takeSnapshotInternal-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>takeSnapshotInternal</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.580">takeSnapshotInternal</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>
+<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="setSnapshotHandlerForTesting-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.master.SnapshotSentinel-">
 <!--   -->
 </a>
 <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.647">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.670">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>
@@ -1056,7 +1105,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.660">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.683">getCoordinator</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>distributed commit coordinator for all running snapshots</dd>
@@ -1069,7 +1118,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.674">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.697">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>
@@ -1091,7 +1140,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.697">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.720">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,
@@ -1120,7 +1169,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.732">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.755">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)
@@ -1145,7 +1194,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.768">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.791">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>
@@ -1165,7 +1214,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.819">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.842">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,
@@ -1195,7 +1244,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.864">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.887">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)
@@ -1221,7 +1270,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.901">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.924">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>
@@ -1237,7 +1286,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.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,
+<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.946">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>
@@ -1256,7 +1305,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.956">cleanupSentinels</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.979">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.
@@ -1270,7 +1319,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.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>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.989">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>
@@ -1285,7 +1334,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.984">cleanupCompletedRestoreInMap</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1007">cleanupCompletedRestoreInMap</a>()</pre>
 <div class="block">Remove the procedures that are marked as finished</div>
 </li>
 </ul>
@@ -1295,7 +1344,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.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>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1024">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>
@@ -1313,7 +1362,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.1021">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1044">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>
@@ -1328,7 +1377,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.1030">checkSnapshotSupport</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1053">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>
@@ -1344,7 +1393,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.1048">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.1071">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>
@@ -1368,7 +1417,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.1120">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.1143">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>,
@@ -1393,7 +1442,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.1148">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.1171">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
@@ -1410,7 +1459,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.1153">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.1176">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>
@@ -1430,7 +1479,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.1158">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.1181">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>
@@ -1450,7 +1499,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.1165">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.1188">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>
@@ -1469,10 +1518,10 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <a name="toSnapshotDescription-org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ProcedureDescription-">
 <!--   -->
 </a>
-<ul class="blockList">
+<ul class="blockListLast">
 <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.1169">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.1192">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>
@@ -1480,15 +1529,6 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 </dl>
 </li>
 </ul>
-<a name="getLocks--">
-<!--   -->
-</a>
-<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.1193">getLocks</a>()</pre>
-</li>
-</ul>
 </li>
 </ul>
 </li>


[09/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 c5c92da..343d45d 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.74">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.
@@ -397,7 +397,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.76">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">
@@ -406,7 +406,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.78">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">
@@ -415,7 +415,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.81">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">
@@ -424,7 +424,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.82">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">
@@ -433,7 +433,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.83">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">
@@ -442,7 +442,7 @@ 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.84">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="rootFs">
@@ -451,7 +451,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <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.85">rootFs</a></pre>
+<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">
@@ -460,7 +460,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <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.86">workingDirFs</a></pre>
+<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">
@@ -469,7 +469,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.87">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">
@@ -478,7 +478,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.88">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">
@@ -487,7 +487,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.89">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">
@@ -496,7 +496,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.90">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">
@@ -505,7 +505,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.91">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">
@@ -514,7 +514,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>tableLock</h4>
-<pre>private 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.92">tableLock</a></pre>
+<pre>private 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">
@@ -523,7 +523,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.93">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">
@@ -532,7 +532,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.94">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">
@@ -541,7 +541,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.95">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">
@@ -550,7 +550,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.96">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">
@@ -559,7 +559,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.98">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>
@@ -576,7 +576,7 @@ 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.108">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)
                     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>
@@ -606,7 +606,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.142">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>
@@ -622,7 +622,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.153">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
@@ -646,7 +646,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.173">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>
@@ -661,7 +661,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <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.272">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.269">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;workingDirFs)
@@ -688,7 +688,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSen
 <ul class="blockList">
 <li class="blockList">
 <h4>downgradeToSharedTableLock</h4>
-<pre>protected abstract&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.302">downgradeToSharedTableLock</a>()</pre>
+<pre>protected abstract&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.299">downgradeToSharedTableLock</a>()</pre>
 <div class="block">When taking snapshot, first we must acquire the exclusive table lock to confirm that there are
  no ongoing merge/split procedures. But later, we should try our best to release the exclusive
  lock as this may hurt the availability, because we need to hold the shared lock when assigning
@@ -703,7 +703,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.307">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.304">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>
@@ -720,7 +720,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.313">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.310">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>
@@ -735,7 +735,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.322">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.319">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>
@@ -752,7 +752,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.333">isFinished</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.330">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>
@@ -770,7 +770,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.338">getCompletionTimestamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.335">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>
@@ -785,7 +785,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.343">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.340">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>
@@ -800,7 +800,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.348">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.345">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>
@@ -818,7 +818,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.353">rethrowExceptionIfFailed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.350">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>.
@@ -837,7 +837,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.358">rethrowException</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.355">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
@@ -856,7 +856,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.363">hasException</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.360">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
@@ -875,7 +875,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.368">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.365">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/3353a0ac/devapidocs/org/apache/hadoop/hbase/master/snapshot/class-use/SnapshotManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/class-use/SnapshotManager.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/class-use/SnapshotManager.html
index e93ddaa..e436af1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/class-use/SnapshotManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/class-use/SnapshotManager.html
@@ -155,10 +155,6 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="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;</code></td>
-<td class="colLast"><span class="typeNameLabel">SnapshotFileCache.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#getSnapshotsInProgress-org.apache.hadoop.hbase.master.snapshot.SnapshotManager-">getSnapshotsInProgress</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;snapshotManager)</code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.fs.FileStatus&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">SnapshotFileCache.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#getUnreferencedFiles-java.lang.Iterable-org.apache.hadoop.hbase.master.snapshot.SnapshotManager-">getUnreferencedFiles</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.fs.FileStatus&gt;&nbsp;files,
                     <a href="../../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;snapshotManager)</code>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 a3022c8..21bc697 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,"i17":9,"i18":9,"i19":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};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -206,18 +206,12 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </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#SNAPSHOT_IN_PROGRESS">SNAPSHOT_IN_PROGRESS</a></span></code>
-<div class="block">This tag will be created in in-progess snapshots</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_LAYOUT_VERSION">SNAPSHOT_LAYOUT_VERSION</a></span></code>
 <div class="block">Version of the fs layout for a snapshot.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_TIMEOUT_MILLIS_DEFAULT">SNAPSHOT_TIMEOUT_MILLIS_DEFAULT</a></span></code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
@@ -225,7 +219,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<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#SNAPSHOT_TIMEOUT_MILLIS_KEY">SNAPSHOT_TIMEOUT_MILLIS_KEY</a></span></code>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
@@ -233,20 +227,20 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </div>
 </td>
 </tr>
-<tr class="altColor">
+<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_TMP_DIR_NAME">SNAPSHOT_TMP_DIR_NAME</a></span></code>
 <div class="block">Temporary directory under the snapshot directory to store in-progress snapshots</div>
 </td>
 </tr>
-<tr class="rowColor">
+<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#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">
+<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#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>
@@ -297,57 +291,50 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </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/SnapshotDescriptionUtils.html#createInProgressTag-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">createInProgressTag</a></span>(org.apache.hadoop.fs.Path&nbsp;workingDir,
-                   org.apache.hadoop.fs.FileSystem&nbsp;fs)</code>
-<div class="block">Create in-progress tag under .tmp of in-progress snapshot</div>
-</td>
-</tr>
-<tr id="i2" 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#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="i3" class="rowColor">
+<tr id="i2" 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#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">
+<tr id="i3" class="rowColor">
 <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">
+<tr id="i4" class="altColor">
 <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,
                    org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription.Type&nbsp;type,
                    long&nbsp;defaultMaxWaitTime)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i5" 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#getSnapshotRootDir-org.apache.hadoop.fs.Path-">getSnapshotRootDir</a></span>(org.apache.hadoop.fs.Path&nbsp;rootDir)</code>
 <div class="block">Get the snapshot root directory.</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i6" 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#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">
+<tr id="i7" class="rowColor">
 <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">
+<tr id="i8" 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.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>
@@ -355,7 +342,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  temporarily copied on export, etc.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<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.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,
@@ -363,7 +350,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 </td>
 </tr>
-<tr id="i11" 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-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,
@@ -371,39 +358,39 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="block">Get the directory to build a snapshot, before it is finalized</div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i11" 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#isSecurityAvailable-org.apache.hadoop.conf.Configuration-">isSecurityAvailable</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i13" 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#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="i14" 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#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">
+<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#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">
+<tr id="i15" 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#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="i17" class="rowColor">
+<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#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>
@@ -411,12 +398,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="i18" class="altColor">
+<tr id="i17" class="rowColor">
 <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="i19" class="rowColor">
+<tr id="i18" class="altColor">
 <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,
@@ -513,27 +500,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </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.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>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_IN_PROGRESS">Constant Field Values</a></dd>
-</dl>
-</li>
-</ul>
 <a name="NO_SNAPSHOT_START_TIME_SPECIFIED">
 <!--   -->
 </a>
 <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.127">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.125">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>
@@ -547,7 +520,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.130">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.128">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>
@@ -560,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>DEFAULT_MAX_WAIT_TIME</h4>
-<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>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.131">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>
@@ -575,7 +548,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.141">SNAPSHOT_TIMEOUT_MILLIS_DEFAULT</a></pre>
+public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.139">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>
@@ -591,7 +564,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.149">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.147">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>
@@ -615,7 +588,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.151">SnapshotDescriptionUtils</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.149">SnapshotDescriptionUtils</a>()</pre>
 </li>
 </ul>
 </li>
@@ -632,7 +605,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.161">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.159">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>
@@ -651,7 +624,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.179">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.177">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>
@@ -668,7 +641,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.190">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.188">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>
@@ -687,7 +660,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.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,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.199">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>
@@ -706,7 +679,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <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.212">getWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.210">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>
@@ -725,7 +698,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <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.224">getWorkingSnapshotDir</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.222">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>
@@ -745,7 +718,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <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.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,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.234">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>
@@ -765,7 +738,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <ul class="blockList">
 <li class="blockList">
 <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,
+<pre>private static final&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.245">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 within the given filepath to store the snapshot instance</div>
 <dl>
@@ -783,7 +756,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.255">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.253">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>
@@ -798,7 +771,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <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,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.264">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>
@@ -817,7 +790,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <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,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.275">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>
@@ -836,7 +809,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <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>
+<pre>private static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.286">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>
@@ -853,7 +826,7 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 <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.302">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.300">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>
@@ -879,7 +852,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.335">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.333">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>
@@ -895,29 +868,13 @@ public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java
 </dl>
 </li>
 </ul>
-<a name="createInProgressTag-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">
-<!--   -->
-</a>
-<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.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>
-<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="readSnapshotInfo-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-">
 <!--   -->
 </a>
 <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.375">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.363">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>
@@ -939,7 +896,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.403">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.391">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)
@@ -966,7 +923,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.422">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.410">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>
@@ -985,7 +942,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.428">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.416">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>
@@ -999,7 +956,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.436">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.424">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/3353a0ac/devapidocs/org/apache/hadoop/hbase/util/class-use/KeyLocker.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/class-use/KeyLocker.html b/devapidocs/org/apache/hadoop/hbase/util/class-use/KeyLocker.html
index 0cdfab7..eb60f10 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/class-use/KeyLocker.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/class-use/KeyLocker.html
@@ -83,18 +83,14 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><a href="#org.apache.hadoop.hbase.master.snapshot">org.apache.hadoop.hbase.master.snapshot</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.replication.regionserver">org.apache.hadoop.hbase.replication.regionserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.util">org.apache.hadoop.hbase.util</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.wal">org.apache.hadoop.hbase.wal</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -103,42 +99,6 @@
 </li>
 <li class="blockList">
 <ul class="blockList">
-<li class="blockList"><a name="org.apache.hadoop.hbase.master.snapshot">
-<!--   -->
-</a>
-<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</a> in <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/package-summary.html">org.apache.hadoop.hbase.master.snapshot</a></h3>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing fields, and an explanation">
-<caption><span>Fields in <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/package-summary.html">org.apache.hadoop.hbase.master.snapshot</a> declared as <a href="../../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</a></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>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code>private <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;</code></td>
-<td class="colLast"><span class="typeNameLabel">SnapshotManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#locks">locks</a></span></code>
-<div class="block">Locks for snapshot operations
-  key is snapshot's filename in progress, value is the related lock
-    - create snapshot
-    - SnapshotCleaner</div>
-</td>
-</tr>
-</tbody>
-</table>
-<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
-<caption><span>Methods in <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/package-summary.html">org.apache.hadoop.hbase.master.snapshot</a> that return <a href="../../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Method and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code><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;</code></td>
-<td class="colLast"><span class="typeNameLabel">SnapshotManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getLocks--">getLocks</a></span>()</code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.replication.regionserver">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/org/apache/hadoop/hbase/util/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-use.html b/devapidocs/org/apache/hadoop/hbase/util/package-use.html
index f0dcd16..412d3e4 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-use.html
@@ -1074,16 +1074,11 @@ service.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/KeyLocker.html#org.apache.hadoop.hbase.master.snapshot">KeyLocker</a>
-<div class="block">A utility class to manage a set of locks.</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/NonceKey.html#org.apache.hadoop.hbase.master.snapshot">NonceKey</a>
 <div class="block">This implementation is not smart and just treats nonce group and nonce as random bits.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/util/class-use/Pair.html#org.apache.hadoop.hbase.master.snapshot">Pair</a>
 <div class="block">A generic class for pairs.</div>
 </td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/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 564c848..6933215 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <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 = "";<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 = "Wed Nov 21 14:44:11 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Fri Nov 23 14:43:16 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 = "1f80a990a945d9efd6b2cf79bf4adb13";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "bddc9576b24e37ec437e3194453db580";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[05/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

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


[11/11] hbase-site git commit: Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.

Posted by gi...@apache.org.
Published site at 6d0dc960e6a937b0c1ad1a1dfc0597382aa11221.


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

Branch: refs/heads/asf-site
Commit: 3353a0acef48c7ba08360d014d9795ec195c5743
Parents: e1f06e8
Author: jenkins <bu...@apache.org>
Authored: Fri Nov 23 14:51:57 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Fri Nov 23 14:51:57 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |    4 +-
 apache_hbase_reference_guide.pdf                |    4 +-
 book.html                                       |    2 +-
 bulk-loads.html                                 |    4 +-
 checkstyle-aggregate.html                       |   70 +-
 checkstyle.rss                                  |   16 +-
 coc.html                                        |    4 +-
 dependencies.html                               |    4 +-
 dependency-convergence.html                     |    4 +-
 dependency-info.html                            |    4 +-
 dependency-management.html                      |    4 +-
 devapidocs/constant-values.html                 |   21 +-
 devapidocs/index-all.html                       |   32 +-
 .../SnapshotFileCache.RefreshCacheTask.html     |    6 +-
 ...SnapshotFileCache.SnapshotDirectoryInfo.html |   12 +-
 .../master/snapshot/SnapshotFileCache.html      |   12 +-
 .../hbase/master/snapshot/SnapshotManager.html  |  260 +-
 .../master/snapshot/TakeSnapshotHandler.html    |   74 +-
 .../snapshot/class-use/SnapshotManager.html     |    4 -
 .../snapshot/SnapshotDescriptionUtils.html      |  139 +-
 .../hadoop/hbase/util/class-use/KeyLocker.html  |   44 +-
 .../apache/hadoop/hbase/util/package-use.html   |    7 +-
 .../org/apache/hadoop/hbase/Version.html        |    4 +-
 .../SnapshotFileCache.RefreshCacheTask.html     |  362 +--
 ...SnapshotFileCache.SnapshotDirectoryInfo.html |  362 +--
 ...SnapshotFileCache.SnapshotFileInspector.html |  362 +--
 .../master/snapshot/SnapshotFileCache.html      |  362 +--
 .../hbase/master/snapshot/SnapshotManager.html  | 2332 +++++++++---------
 .../master/snapshot/TakeSnapshotHandler.html    |  689 +++---
 ...Utils.CompletedSnaphotDirectoriesFilter.html |  640 +++--
 .../snapshot/SnapshotDescriptionUtils.html      |  640 +++--
 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            |    1 +
 testdevapidocs/allclasses-noframe.html          |    1 +
 testdevapidocs/constant-values.html             |   19 +
 testdevapidocs/index-all.html                   |   44 +
 .../hbase/class-use/HBaseClassTestRule.html     |   24 +-
 .../hbase/class-use/HBaseTestingUtility.html    |   14 +-
 .../hadoop/hbase/class-use/TestTableName.html   |    4 +
 .../hadoop/hbase/io/hfile/package-tree.html     |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |   12 +-
 .../hadoop/hbase/procedure2/package-tree.html   |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html |    6 +-
 .../hbase/snapshot/TestSnapshotManifest.html    |    4 +-
 .../snapshot/TestSnapshotWhenChoreCleaning.html |  571 +++++
 .../TestSnapshotWhenChoreCleaning.html          |  125 +
 .../hadoop/hbase/snapshot/package-frame.html    |    1 +
 .../hadoop/hbase/snapshot/package-summary.html  |    6 +
 .../hadoop/hbase/snapshot/package-tree.html     |    1 +
 .../apache/hadoop/hbase/test/package-tree.html  |    2 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |    4 +-
 testdevapidocs/overview-tree.html               |    1 +
 .../TestSnapshotFileCache.SnapshotFiles.html    |    4 +-
 .../master/snapshot/TestSnapshotFileCache.html  |    4 +-
 .../TestSnapshotHFileCleaner.SnapshotFiles.html |    6 +-
 .../snapshot/TestSnapshotHFileCleaner.html      |    6 +-
 .../snapshot/TestSnapshotWhenChoreCleaning.html |  279 +++
 78 files changed, 4376 insertions(+), 3341 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 09e024c..e49e5be 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -611,7 +611,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 9d56cd7..6c5ce42 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20181121143253+00'00')
-/CreationDate (D:20181121144917+00'00')
+/ModDate (D:20181123143244+00'00')
+/CreationDate (D:20181123144827+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 58b2425..9c6668f 100644
--- a/book.html
+++ b/book.html
@@ -41318,7 +41318,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-11-21 14:32:53 UTC
+Last updated 2018-11-23 14:32:44 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 45d6cc9..d8a6bab 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -316,7 +316,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index a14f98b..83bca84 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -291,7 +291,7 @@
 <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>3813</td>
+<td>3814</td>
 <td>0</td>
 <td>0</td>
 <td>14984</td></tr></table></div>
@@ -9811,12 +9811,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>731</td>
+<td>730</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3452</td>
+<td>3453</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>misc</td>
@@ -19110,7 +19110,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
+<td>NonEmptyAtclauseDescription</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">
@@ -68234,7 +68234,7 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>220</td></tr></table></div>
+<td>237</td></tr></table></div>
 <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">
@@ -68264,97 +68264,97 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>218</td></tr>
+<td>217</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>289</td></tr>
+<td>288</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
-<td>293</td></tr>
+<td>292</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>331</td></tr>
+<td>330</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>406</td></tr>
+<td>405</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>553</td></tr>
+<td>567</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>642</td></tr>
+<td>665</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>645</td></tr>
+<td>668</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>695</td></tr>
+<td>718</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>764</td></tr>
+<td>787</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>766</td></tr>
+<td>789</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>
+<td>840</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>975</td></tr>
+<td>998</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>1003</td></tr>
+<td>1026</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>1058</td></tr>
+<td>1081</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>1062</td></tr></table></div>
+<td>1085</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">
@@ -68369,19 +68369,19 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>69</td></tr>
+<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>214</td></tr>
+<td>212</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>323</td></tr></table></div>
+<td>320</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">
@@ -102146,55 +102146,55 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>130</td></tr>
+<td>128</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>165</td></tr>
+<td>163</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>166</td></tr>
+<td>164</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>167</td></tr>
+<td>165</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 102).</td>
-<td>190</td></tr>
+<td>188</td></tr>
 <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>373</td></tr>
+<td>361</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>385</td></tr>
+<td>373</td></tr>
 <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>400</td></tr>
+<td>388</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>424</td></tr></table></div>
+<td>412</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException.java">org/apache/hadoop/hbase/snapshot/SnapshotDoesNotExistException.java</h3>
 <table border="0" class="table table-striped">
@@ -116667,7 +116667,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 3281d20..4d67fa0 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,7 +25,7 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3813,
+      <title>File: 3814,
              Errors: 14984,
              Warnings: 0,
              Infos: 0
@@ -21802,6 +21802,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.snapshot.TestSnapshotWhenChoreCleaning.java">org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.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.procedure2.ProcedureUtil.java">org/apache/hadoop/hbase/procedure2/ProcedureUtil.java</a>
                 </td>
                 <td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index c16dea3..53b981f 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -385,7 +385,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-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 6113d23..ee46353 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -450,7 +450,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 801c3c0..af9d999 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -680,7 +680,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index ab50b95..5dec44d 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -323,7 +323,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 04a76b6..2c5fe22 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="20181121" />
+    <meta name="Date-Revision-yyyymmdd" content="20181123" />
     <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" />
@@ -1009,7 +1009,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-11-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-11-23</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index bc36bfa..a9a7cb7 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3824,7 +3824,7 @@
 <!--   -->
 </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>"Wed Nov 21 14:44:11 UTC 2018"</code></td>
+<td class="colLast"><code>"Fri Nov 23 14:43:16 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3838,7 +3838,7 @@
 <!--   -->
 </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>"1f80a990a945d9efd6b2cf79bf4adb13"</code></td>
+<td class="colLast"><code>"bddc9576b24e37ec437e3194453db580"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -26203,48 +26203,41 @@
 <td class="colLast"><code>0L</code></td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_IN_PROGRESS">
-<!--   -->
-</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_IN_PROGRESS">SNAPSHOT_IN_PROGRESS</a></code></td>
-<td class="colLast"><code>".inprogress"</code></td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_LAYOUT_VERSION">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_LAYOUT_VERSION">SNAPSHOT_LAYOUT_VERSION</a></code></td>
 <td class="colLast"><code>2</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_TIMEOUT_MILLIS_DEFAULT">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_TIMEOUT_MILLIS_DEFAULT">SNAPSHOT_TIMEOUT_MILLIS_DEFAULT</a></code></td>
 <td class="colLast"><code>300000</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_TIMEOUT_MILLIS_KEY">
 <!--   -->
 </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_TIMEOUT_MILLIS_KEY">SNAPSHOT_TIMEOUT_MILLIS_KEY</a></code></td>
 <td class="colLast"><code>"hbase.snapshot.master.timeoutMillis"</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.SNAPSHOT_TMP_DIR_NAME">
 <!--   -->
 </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_TMP_DIR_NAME">SNAPSHOT_TMP_DIR_NAME</a></code></td>
 <td class="colLast"><code>".tmp"</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <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">
+<tr class="altColor">
 <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/3353a0ac/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 11dc849..21876de 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -20285,10 +20285,6 @@
 <dd>
 <div class="block">Create initial layout in filesystem.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#createInProgressTag-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.FileSystem-">createInProgressTag(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>
-<div class="block">Create in-progress tag under .tmp of in-progress snapshot</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CompactionTool.CompactionInputFormat.html#createInputFile-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-java.util.Set-">createInputFile(FileSystem, Path, Set&lt;Path&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CompactionTool.CompactionInputFormat.html" title="class in org.apache.hadoop.hbase.regionserver">CompactionTool.CompactionInputFormat</a></dt>
 <dd>
 <div class="block">Create the input file for the given directories to compact.</div>
@@ -42221,8 +42217,6 @@
 <dd>
 <div class="block">List lock queues.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getLocks--">getLocks()</a></span> - Method 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/procedure2/ProcedureScheduler.html#getLocks--">getLocks()</a></span> - Method in interface org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a></dt>
 <dd>
 <div class="block">List lock queues.</div>
@@ -50577,7 +50571,7 @@
 <div class="block">Computes a mapping of originating <code>TableName</code> to snapshots, when the <code>TableName</code>
  exists in the provided <code>Set</code>.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#getSnapshotsInProgress-org.apache.hadoop.hbase.master.snapshot.SnapshotManager-">getSnapshotsInProgress(SnapshotManager)</a></span> - Method 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>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#getSnapshotsInProgress--">getSnapshotsInProgress()</a></span> - Method 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/regionserver/AbstractMemStore.html#getSnapshotSize--">getSnapshotSize()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></dt>
 <dd>&nbsp;</dd>
@@ -53007,6 +53001,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CompactionPipeline.html#getTailSize--">getTailSize()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CompactionPipeline.html" title="class in org.apache.hadoop.hbase.regionserver">CompactionPipeline</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getTakingSnapshotLock--">getTakingSnapshotLock()</a></span> - Method 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/backup/BackupRequest.html#getTargetRootDir--">getTargetRootDir()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/BackupRequest.html" title="class in org.apache.hadoop.hbase.backup">BackupRequest</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RegionMover.html#getTargetServer--">getTargetServer()</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>
@@ -65711,6 +65707,11 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/Segment.html#isTagsPresent--">isTagsPresent()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#isTakingAnySnapshot--">isTakingAnySnapshot()</a></span> - Method 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>
+<div class="block">The snapshot operation processing as following: <br>
+ 1.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#isTakingSnapshot-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">isTakingSnapshot(SnapshotProtos.SnapshotDescription)</a></span> - Method 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>
 <div class="block">Check to see if there is a snapshot in progress with the same name or on the same table.</div>
@@ -69043,13 +69044,6 @@
 <div class="block">Creates Mini-batch of all operations [nextIndexToProcess, lastIndexExclusive) for which
  a row lock can be acquired.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#locks">locks</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>
-<div class="block">Locks for snapshot operations
-  key is snapshot's filename in progress, value is the related lock
-    - create snapshot
-    - SnapshotCleaner</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/MasterQuotaManager.NamedLock.html#locks">locks</a></span> - Variable in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/MasterQuotaManager.NamedLock.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager.NamedLock</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/client/locking/LockServiceClient.html" title="class in org.apache.hadoop.hbase.client.locking"><span class="typeNameLink">LockServiceClient</span></a> - Class in <a href="org/apache/hadoop/hbase/client/locking/package-summary.html">org.apache.hadoop.hbase.client.locking</a></dt>
@@ -108260,10 +108254,6 @@ service.</div>
 <dd>
 <div class="block">Name of the directory to store all snapshots.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#SNAPSHOT_IN_PROGRESS">SNAPSHOT_IN_PROGRESS</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">This tag will be created in in-progess snapshots</div>
-</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.html#SNAPSHOT_INPUTFORMAT_LOCALITY_ENABLED_DEFAULT">SNAPSHOT_INPUTFORMAT_LOCALITY_ENABLED_DEFAULT</a></span> - Static variable 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/mapreduce/TableSnapshotInputFormatImpl.html#SNAPSHOT_INPUTFORMAT_LOCALITY_ENABLED_KEY">SNAPSHOT_INPUTFORMAT_LOCALITY_ENABLED_KEY</a></span> - Static variable 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>
@@ -114026,10 +114016,16 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#TakeSnapshotHandler-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.master.snapshot.SnapshotManager-">TakeSnapshotHandler(SnapshotProtos.SnapshotDescription, MasterServices, SnapshotManager)</a></span> - Constructor for 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/master/snapshot/SnapshotManager.html#takeSnapshotInternal-org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription-">takeSnapshotInternal(SnapshotProtos.SnapshotDescription)</a></span> - Method 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/regionserver/wal/FSHLog.SyncRunner.html#takeSyncFuture">takeSyncFuture</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.SyncRunner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/util/DelayedUtil.html#takeWithoutInterrupt-java.util.concurrent.DelayQueue-">takeWithoutInterrupt(DelayQueue&lt;E&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.util.<a href="org/apache/hadoop/hbase/procedure2/util/DelayedUtil.html" title="class in org.apache.hadoop.hbase.procedure2.util">DelayedUtil</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#takingSnapshotLock">takingSnapshotLock</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>
+<div class="block">Read write lock between taking snapshot and snapshot HFile cleaner.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/cleaner/LogCleaner.CleanerContext.html#target">target</a></span> - Variable in class org.apache.hadoop.hbase.master.cleaner.<a href="org/apache/hadoop/hbase/master/cleaner/LogCleaner.CleanerContext.html" title="class in org.apache.hadoop.hbase.master.cleaner">LogCleaner.CleanerContext</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/ExportSnapshot.Options.html#TARGET_NAME">TARGET_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/ExportSnapshot.Options.html" title="class in org.apache.hadoop.hbase.snapshot">ExportSnapshot.Options</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
index 39e3f09..8923097 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.309">SnapshotFileCache.RefreshCacheTask</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.317">SnapshotFileCache.RefreshCacheTask</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TimerTask.html?is-external=true" title="class or interface in java.util">TimerTask</a></pre>
 <div class="block">Simple helper task that just periodically attempts to refresh the cache</div>
 </li>
@@ -199,7 +199,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TimerTask.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RefreshCacheTask</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html#line.309">RefreshCacheTask</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html#line.317">RefreshCacheTask</a>()</pre>
 </li>
 </ul>
 </li>
@@ -216,7 +216,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TimerTask.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html#line.311">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html#line.319">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/3353a0ac/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
index cc62208..af18761 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.337">SnapshotFileCache.SnapshotDirectoryInfo</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.345">SnapshotFileCache.SnapshotDirectoryInfo</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">Information about a snapshot directory</div>
 </li>
@@ -213,7 +213,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lastModified</h4>
-<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.338">lastModified</a></pre>
+<pre>long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.346">lastModified</a></pre>
 </li>
 </ul>
 <a name="files">
@@ -222,7 +222,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>files</h4>
-<pre><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="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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.339">files</a></pre>
+<pre><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="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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.347">files</a></pre>
 </li>
 </ul>
 </li>
@@ -239,7 +239,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SnapshotDirectoryInfo</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.341">SnapshotDirectoryInfo</a>(long&nbsp;mtime,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.349">SnapshotDirectoryInfo</a>(long&nbsp;mtime,
                              <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="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;files)</pre>
 </li>
 </ul>
@@ -257,7 +257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getFiles</h4>
-<pre>public&nbsp;<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="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/SnapshotFileCache.SnapshotDirectoryInfo.html#line.349">getFiles</a>()</pre>
+<pre>public&nbsp;<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="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/SnapshotFileCache.SnapshotDirectoryInfo.html#line.357">getFiles</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the hfiles in the snapshot when <tt>this</tt> was made.</dd>
@@ -270,7 +270,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hasBeenModified</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.359">hasBeenModified</a>(long&nbsp;mtime)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.367">hasBeenModified</a>(long&nbsp;mtime)</pre>
 <div class="block">Check if the snapshot directory has been modified</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/3353a0ac/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
index 999763f..c2e0454 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html
@@ -284,7 +284,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="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;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#getSnapshotsInProgress-org.apache.hadoop.hbase.master.snapshot.SnapshotManager-">getSnapshotsInProgress</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a>&nbsp;snapshotManager)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#getSnapshotsInProgress--">getSnapshotsInProgress</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;org.apache.hadoop.fs.FileStatus&gt;</code></td>
@@ -539,7 +539,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshCache</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.207">refreshCache</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.224">refreshCache</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>
@@ -547,13 +547,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 </dl>
 </li>
 </ul>
-<a name="getSnapshotsInProgress-org.apache.hadoop.hbase.master.snapshot.SnapshotManager-">
+<a name="getSnapshotsInProgress--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotsInProgress</h4>
-<pre><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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.272">getSnapshotsInProgress</a>(<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="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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.290">getSnapshotsInProgress</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>
@@ -567,7 +567,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/SnapshotFileCache.html#line.321">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/SnapshotFileCache.html#line.329">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>
@@ -585,7 +585,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" ti
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.330">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.338">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>