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 Class</span></a></li>
+<li>Next 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All 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: </li>
+<li>Nested | </li>
+<li><a href="#field.summary">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail: </li>
+<li><a href="#field.detail">Field</a> | </li>
+<li><a href="#constructor.detail">Constr</a> | </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"> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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"> </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> </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"> </span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd"> </span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd"> </span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd"> </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> </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 i)</code> </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 fs)</code> </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><org.apache.hadoop.fs.Path></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 fs,
+ org.apache.hadoop.fs.Path tableDir)</code> </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> </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> </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> </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> </td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!-- -->
+</a>
+<h3>Methods inherited from class 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 <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 <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 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 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 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 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 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 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 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 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 <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 <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 void <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 byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.92">integerToBytes</a>(int i)</pre>
+</li>
+</ul>
+<a name="createTable--">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>createTable</h4>
+<pre>private static void <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 void <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 void <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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.fs.Path> <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.118">listHFileNames</a>(org.apache.hadoop.fs.FileSystem fs,
+ org.apache.hadoop.fs.Path 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 boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html#line.128">isAnySnapshots</a>(org.apache.hadoop.fs.FileSystem 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 void <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 Class</span></a></li>
+<li>Next 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All 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: </li>
+<li>Nested | </li>
+<li><a href="#field.summary">Field</a> | </li>
+<li><a href="#constructor.summary">Constr</a> | </li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail: </li>
+<li><a href="#field.detail">Field</a> | </li>
+<li><a href="#constructor.detail">Constr</a> | </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 © 2007–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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All 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 Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All 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 © 2007–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"> </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><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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<String> getSnapshotsInProgress(final SnapshotManager snapshotManager)<a name="line.150"></a>
+<span class="sourceLineNo">150</span> List<String> getSnapshotsInProgress()<a name="line.150"></a>
<span class="sourceLineNo">151</span> throws IOException {<a name="line.151"></a>
-<span class="sourceLineNo">152</span> List<String> result = super.getSnapshotsInProgress(snapshotManager);<a name="line.152"></a>
+<span class="sourceLineNo">152</span> List<String> 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<String> getSnapshotsInProgress(final SnapshotManager snapshotManager)<a name="line.150"></a>
+<span class="sourceLineNo">150</span> List<String> getSnapshotsInProgress()<a name="line.150"></a>
<span class="sourceLineNo">151</span> throws IOException {<a name="line.151"></a>
-<span class="sourceLineNo">152</span> List<String> result = super.getSnapshotsInProgress(snapshotManager);<a name="line.152"></a>
+<span class="sourceLineNo">152</span> List<String> 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 < 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 < 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<Path> 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<Path> hfiles = new ArrayList<>();<a name="line.120"></a>
+<span class="sourceLineNo">121</span> FSVisitor.visitTableStoreFiles(fs, tableDir, (region, family, hfileName) -> {<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 && 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 && tmpSnapFiles.length > 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<Path> 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<FileStatus> files = new ArrayList<>();<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 = () -> {<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 < 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 = () -> {<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 < 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<FileStatus> toDeleteFiles = cleaner.getDeletableFiles(files);<a name="line.185"></a>
+<span class="sourceLineNo">186</span> List<FileStatus> 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 < 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() > 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<FileStatus> unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
<span class="sourceLineNo">185</span> List<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> 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<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span> List<String> 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span> */<a name="line.348"></a>
-<span class="sourceLineNo">349</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span> * created <tt>this</tt><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 < 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span> */<a name="line.356"></a>
+<span class="sourceLineNo">357</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span> * created <tt>this</tt><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 < 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<FileStatus> unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
<span class="sourceLineNo">185</span> List<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> 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<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span> List<String> 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span> */<a name="line.348"></a>
-<span class="sourceLineNo">349</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span> * created <tt>this</tt><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 < 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span> */<a name="line.356"></a>
+<span class="sourceLineNo">357</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span> * created <tt>this</tt><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 < 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<FileStatus> unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
<span class="sourceLineNo">185</span> List<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> 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<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span> List<String> 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span> */<a name="line.348"></a>
-<span class="sourceLineNo">349</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span> * created <tt>this</tt><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 < 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span> */<a name="line.356"></a>
+<span class="sourceLineNo">357</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span> * created <tt>this</tt><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 < 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<FileStatus> unReferencedFiles = Lists.newArrayList();<a name="line.184"></a>
<span class="sourceLineNo">185</span> List<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> 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<String> 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 && !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() > 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() <= 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<String, SnapshotDirectoryInfo> known = new HashMap<>();<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() && this.snapshots.size() > 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<String> 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<String> getSnapshotsInProgress() throws IOException {<a name="line.290"></a>
+<span class="sourceLineNo">291</span> List<String> 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.347"></a>
-<span class="sourceLineNo">348</span> */<a name="line.348"></a>
-<span class="sourceLineNo">349</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.356"></a>
-<span class="sourceLineNo">357</span> * created <tt>this</tt><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 < 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<String> 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<String> 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 <tt>this</tt> was made.<a name="line.355"></a>
+<span class="sourceLineNo">356</span> */<a name="line.356"></a>
+<span class="sourceLineNo">357</span> public Collection<String> 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 <tt>true</tt> if it the modification time of the directory is newer time when we<a name="line.364"></a>
+<span class="sourceLineNo">365</span> * created <tt>this</tt><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 < 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 – 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 – 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 – 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"> </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 static final 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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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<BytesWritable, NullWritable, NullWritable, NullWritable>.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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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><E> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a><T>, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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 Class</span></a></li>
-<li>Next Class</li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next 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 Class</span></a></li>
-<li>Next Class</li>
+<li><a href="../../../../../org/apache/hadoop/hbase/snapshot/TestSnapshotWhenChoreCleaning.html" title="class in org.apache.hadoop.hbase.snapshot"><span class="typeNameLink">Next 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<String, UserPermission> perms =<a name="line.438"></a>
-<span class="sourceLineNo">439</span> User.runAsLoginUser(new PrivilegedExceptionAction<ListMultimap<String, UserPermission>>() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span> @Override<a name="line.440"></a>
-<span class="sourceLineNo">441</span> public ListMultimap<String, UserPermission> 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<String, UserPermission> perms =<a name="line.426"></a>
+<span class="sourceLineNo">427</span> User.runAsLoginUser(new PrivilegedExceptionAction<ListMultimap<String, UserPermission>>() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public ListMultimap<String, UserPermission> 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> * <p><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> * <p><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<TableName, SnapshotSentinel> snapshotHandlers = new HashMap<>();<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<TableName, Long> restoreTableToProcIdMap = new HashMap<>();<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<String> locks = new KeyLocker<>();<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> * <p><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> * <p><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<TableName, SnapshotSentinel> snapshotHandlers = new HashMap<>();<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<TableName, Long> restoreTableToProcIdMap = new HashMap<>();<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<SnapshotDescription> 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<SnapshotDescription> 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<SnapshotDescription> snapshotDescs = new ArrayList<>();<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 && 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 <tt>true</tt> 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<Map.Entry<TableName, SnapshotSentinel>> 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<TableName, SnapshotSentinel> 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()) && !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 <tt>true</tt> 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 && !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<SnapshotDescription> 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<SnapshotDescription> 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<SnapshotDescription> snapshotDescs = new ArrayList<>();<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 && 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<String, UserPermission> perms =<a name="line.438"></a>
-<span class="sourceLineNo">439</span> User.runAsLoginUser(new PrivilegedExceptionAction<ListMultimap<String, UserPermission>>() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span> @Override<a name="line.440"></a>
-<span class="sourceLineNo">441</span> public ListMultimap<String, UserPermission> 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<String, UserPermission> perms =<a name="line.426"></a>
+<span class="sourceLineNo">427</span> User.runAsLoginUser(new PrivilegedExceptionAction<ListMultimap<String, UserPermission>>() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span> @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span> public ListMultimap<String, UserPermission> 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 – 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 –
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 – 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 – 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 – 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 – 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 – 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 –
Apache HBase (TM) Metrics
@@ -469,7 +469,7 @@ export HBASE_REGIONSERVER_OPTS="$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 –
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 – 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 – 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 – 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 – 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 – 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 – 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 –
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 –
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 – 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 – 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> </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><<a href="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#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> </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> </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><<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>></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#restoreTableToProcIdMap">restoreTableToProcIdMap</a></span></code> </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> </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><<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>></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#snapshotHandlers">snapshotHandlers</a></span></code> </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> </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> </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><<a href="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#getLocks--">getLocks</a></span>()</code> </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> </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> 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> </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 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> 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 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><<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>> sentinels,
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription 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 reqSnapshot,
<a href="../../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a> 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 snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> 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 reqSnapshot,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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> tableName,
<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a> 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 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 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 snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a> 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> 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 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 snapshot)</code> </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 desc)</code> </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 org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.105">LOG</a></pre>
+<pre>private static final 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 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 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 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 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 <a href="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 <a href="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 <a href="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 <a href="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 <a href="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 <a href="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 <a href="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 <a href="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 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 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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.141">stopped</a></pre>
+<pre>private 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 <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 <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 <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 <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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.146">isSnapshotSupported</a></pre>
+<pre>private 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="../../../../../../org/apache/hadoop/hbase/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>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.152">snapshotHandlers</a></pre>
+<pre>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><<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>> <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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a><<a href="../../../../../../org/apache/hadoop/hbase/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>> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.161">restoreTableToProcIdMap</a></pre>
+<pre>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><<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>> <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 org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.163">rootDir</a></pre>
+<pre>private 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 <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 <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 <a href="../../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> <a href="../../../../../../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 <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 <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.176">SnapshotManager</a>()</pre>
+<pre>public <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 <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> master,
+<pre>public <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> master,
<a href="../../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a> metricsMaster,
<a href="../../../../../../org/apache/hadoop/hbase/procedure/ProcedureCoordinator.html" title="class in org.apache.hadoop.hbase.procedure">ProcedureCoordinator</a> coordinator,
<a href="../../../../../../org/apache/hadoop/hbase/executor/ExecutorService.html" title="class in org.apache.hadoop.hbase.executor">ExecutorService</a> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.202">getCompletedSnapshots</a>()
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription> <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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a><org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.213">getCompletedSnapshots</a>(org.apache.hadoop.fs.Path snapshotDir,
+<pre>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><org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.212">getCompletedSnapshots</a>(org.apache.hadoop.fs.Path snapshotDir,
boolean 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 <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.277">resetTempDir</a>()
+<pre>void <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 void <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 snapshot)
+<pre>public void <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 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 boolean <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 expected)
+<pre>public boolean <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 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 <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 snapshot)</pre>
+<pre>boolean <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 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 boolean <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> tableName)</pre>
+<pre>public boolean <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> 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 void <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 snapshot)
+<pre>private void <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 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 void <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 snapshot)
+<pre>private void <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 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 void <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 snapshot)
+<pre>private void <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 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 void <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 snapshot,
+<pre>private void <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 snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a> 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 <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> <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 boolean <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 void <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 snapshot)
+<pre>public void <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 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 void <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 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 void <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> tableName,
+<pre>public void <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> tableName,
<a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a> 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> <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> <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 boolean <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 snapshot)
+<pre>private boolean <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 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 long <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 reqSnapshot,
+<pre>private long <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 reqSnapshot,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName,
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> 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 <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 snapshot,
+<pre>long <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 snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> tableDescriptor,
<a href="../../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a> nonceKey,
boolean 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 long <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 reqSnapshot,
+<pre>public long <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 reqSnapshot,
<a href="../../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a> nonceKey,
boolean 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 long <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 reqSnapshot,
+<pre>private long <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 reqSnapshot,
<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName,
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> 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 long <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 snapshot,
+<pre>private long <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 snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> tableDescriptor,
<a href="../../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a> nonceKey,
boolean 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 boolean <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> tableName)</pre>
+<pre>private boolean <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> 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 <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a> <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><<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>> sentinels,
+<pre>private <a href="../../../../../../org/apache/hadoop/hbase/master/SnapshotSentinel.html" title="interface in org.apache.hadoop.hbase.master">SnapshotSentinel</a> <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><<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>> sentinels,
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.956">cleanupSentinels</a>()</pre>
+<pre>private void <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 void <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><<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>> sentinels)</pre>
+<pre>private void <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><<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>> 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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.984">cleanupCompletedRestoreInMap</a>()</pre>
+<pre>private void <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 void <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> why)</pre>
+<pre>public void <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> why)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1021">isStopped</a>()</pre>
+<pre>public boolean <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> in interface <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1030">checkSnapshotSupport</a>()
+<pre>public void <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1048">checkSnapshotSupport</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>private void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#line.1071">checkSnapshotSupport</a>(org.apache.hadoop.conf.Configuration conf,
<a href="../../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a> 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 void <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> master,
+<pre>public void <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> master,
<a href="../../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a> 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 <a href="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.1148">getProcedureSignature</a>()</pre>
+<pre>public <a href="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.1171">getProcedureSignature</a>()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from class: <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 void <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 desc)
+<pre>public void <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 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: <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 void <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 desc,
+<pre>public void <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 desc,
<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessChecker.html" title="class in org.apache.hadoop.hbase.security.access">AccessChecker</a> accessChecker,
<a href="../../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> 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 boolean <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 desc)
+<pre>public boolean <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 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: <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 org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <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 desc)
+<pre>private org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <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 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 <a href="../../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</a><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> <a href="../../../../../../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 org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.76">LOG</a></pre>
+<pre>private static final 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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.78">finished</a></pre>
+<pre>private volatile 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 <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 <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 <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 <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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 snapshot,
+<pre>public <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 snapshot,
<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> masterServices,
<a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> 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 <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.142">loadTableDescriptor</a>()
+<pre>private <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.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 <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.153">prepare</a>()
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html" title="class in org.apache.hadoop.hbase.master.snapshot">TakeSnapshotHandler</a> <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: <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.173">process</a>()</pre>
+<pre>public void <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.272">completeSnapshot</a>(org.apache.hadoop.fs.Path snapshotDir,
+<pre>public void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.269">completeSnapshot</a>(org.apache.hadoop.fs.Path snapshotDir,
org.apache.hadoop.fs.Path workingDir,
org.apache.hadoop.fs.FileSystem fs,
org.apache.hadoop.fs.FileSystem 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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.302">downgradeToSharedTableLock</a>()</pre>
+<pre>protected abstract boolean <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 void <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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>>> regions)
+<pre>protected abstract void <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><<a href="../../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>>> 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 void <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> regionInfo)
+<pre>protected void <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> 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 void <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> why)</pre>
+<pre>public void <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> why)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.333">isFinished</a>()</pre>
+<pre>public boolean <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: <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 long <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.338">getCompletionTimestamp</a>()</pre>
+<pre>public long <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> in interface <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 org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.343">getSnapshot</a>()</pre>
+<pre>public org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <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> in interface <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 <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.348">getExceptionIfFailed</a>()</pre>
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a> <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: <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.353">rethrowExceptionIfFailed</a>()
+<pre>public void <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: <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.358">rethrowException</a>()
+<pre>public void <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: <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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.363">hasException</a>()</pre>
+<pre>public boolean <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: <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 <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.html#line.368">getException</a>()</pre>
+<pre>public <a href="../../../../../../org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling">ForeignException</a> <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: <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><<a href="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"><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> snapshotManager)</code> </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><org.apache.hadoop.fs.FileStatus></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><org.apache.hadoop.fs.FileStatus> files,
<a href="../../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> 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>
@@ -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>
@@ -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 workingDir,
- org.apache.hadoop.fs.FileSystem 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 snapshot,
org.apache.hadoop.fs.Path 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> snapshotName,
org.apache.hadoop.fs.Path 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 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 conf,
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription.Type type,
long defaultMaxWaitTime)</code> </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 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 rootDir)</code> </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 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> 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 rootDir,
org.apache.hadoop.conf.Configuration 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 snapshot,
org.apache.hadoop.fs.Path 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> snapshotName,
org.apache.hadoop.fs.Path 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 conf)</code> </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> snapshot,
<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> 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 workingDir,
org.apache.hadoop.fs.Path 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 workingDir,
org.apache.hadoop.conf.Configuration 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 fs,
org.apache.hadoop.fs.Path 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 snapshot,
org.apache.hadoop.conf.Configuration 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 snapshot,
org.apache.hadoop.conf.Configuration conf)</code> </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 snapshot,
org.apache.hadoop.fs.Path 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 <a href="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 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 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 <a href="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 <a href="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 long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.133">DEFAULT_MAX_WAIT_TIME</a></pre>
+<pre>public static final 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 int <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.141">SNAPSHOT_TIMEOUT_MILLIS_DEFAULT</a></pre>
+public static final 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> <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 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 <a href="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 <a href="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> <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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockListLast">
<li class="blockList">
<h4>SnapshotDescriptionUtils</h4>
-<pre>private <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.151">SnapshotDescriptionUtils</a>()</pre>
+<pre>private <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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getMaxMasterTimeout</h4>
-<pre>public static long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.161">getMaxMasterTimeout</a>(org.apache.hadoop.conf.Configuration conf,
+<pre>public static long <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.159">getMaxMasterTimeout</a>(org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription.Type type,
long defaultMaxWaitTime)</pre>
<dl>
@@ -651,7 +624,7 @@ public static final <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getSnapshotRootDir</h4>
-<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.179">getSnapshotRootDir</a>(org.apache.hadoop.fs.Path rootDir)</pre>
+<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.177">getSnapshotRootDir</a>(org.apache.hadoop.fs.Path 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getCompletedSnapshotDir</h4>
-<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.190">getCompletedSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
+<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.188">getCompletedSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
org.apache.hadoop.fs.Path 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getCompletedSnapshotDir</h4>
-<pre>public static org.apache.hadoop.fs.Path <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> snapshotName,
+<pre>public static org.apache.hadoop.fs.Path <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> snapshotName,
org.apache.hadoop.fs.Path 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getWorkingSnapshotDir</h4>
-<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.212">getWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path rootDir,
+<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.210">getWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path rootDir,
org.apache.hadoop.conf.Configuration 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getWorkingSnapshotDir</h4>
-<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.224">getWorkingSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
+<pre>public static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.222">getWorkingSnapshotDir</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
org.apache.hadoop.fs.Path rootDir,
org.apache.hadoop.conf.Configuration conf)</pre>
<div class="block">Get the directory to build a snapshot, before it is finalized</div>
@@ -745,7 +718,7 @@ public static final <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getWorkingSnapshotDir</h4>
-<pre>public static org.apache.hadoop.fs.Path <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> snapshotName,
+<pre>public static org.apache.hadoop.fs.Path <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> snapshotName,
org.apache.hadoop.fs.Path rootDir,
org.apache.hadoop.conf.Configuration conf)</pre>
<div class="block">Get the directory to build a snapshot, before it is finalized</div>
@@ -765,7 +738,7 @@ public static final <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getSpecifiedSnapshotDir</h4>
-<pre>private static final org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.247">getSpecifiedSnapshotDir</a>(org.apache.hadoop.fs.Path snapshotsDir,
+<pre>private static final org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.245">getSpecifiedSnapshotDir</a>(org.apache.hadoop.fs.Path 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> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getSnapshotsDir</h4>
-<pre>public static final org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.255">getSnapshotsDir</a>(org.apache.hadoop.fs.Path rootDir)</pre>
+<pre>public static final org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.253">getSnapshotsDir</a>(org.apache.hadoop.fs.Path 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>isSubDirectoryOf</h4>
-<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.266">isSubDirectoryOf</a>(org.apache.hadoop.fs.Path workingDir,
+<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.264">isSubDirectoryOf</a>(org.apache.hadoop.fs.Path workingDir,
org.apache.hadoop.fs.Path 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>isWithinDefaultWorkingDir</h4>
-<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.277">isWithinDefaultWorkingDir</a>(org.apache.hadoop.fs.Path workingDir,
+<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.275">isWithinDefaultWorkingDir</a>(org.apache.hadoop.fs.Path workingDir,
org.apache.hadoop.conf.Configuration 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>getDefaultWorkingSnapshotDir</h4>
-<pre>private static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.288">getDefaultWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path rootDir)</pre>
+<pre>private static org.apache.hadoop.fs.Path <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.286">getDefaultWorkingSnapshotDir</a>(org.apache.hadoop.fs.Path 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>validate</h4>
-<pre>public static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.302">validate</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
+<pre>public static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.300">validate</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
org.apache.hadoop.conf.Configuration 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>writeSnapshotInfo</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.335">writeSnapshotInfo</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.333">writeSnapshotInfo</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
org.apache.hadoop.fs.Path workingDir,
org.apache.hadoop.fs.FileSystem 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 <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 void <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.360">createInProgressTag</a>(org.apache.hadoop.fs.Path workingDir,
- org.apache.hadoop.fs.FileSystem 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 org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.375">readSnapshotInfo</a>(org.apache.hadoop.fs.FileSystem fs,
+<pre>public static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.363">readSnapshotInfo</a>(org.apache.hadoop.fs.FileSystem fs,
org.apache.hadoop.fs.Path 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>completeSnapshot</h4>
-<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.403">completeSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
+<pre>public static void <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.391">completeSnapshot</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
org.apache.hadoop.fs.Path rootdir,
org.apache.hadoop.fs.Path workingDir,
org.apache.hadoop.fs.FileSystem fs)
@@ -966,7 +923,7 @@ public static final <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>isSnapshotOwner</h4>
-<pre>public static boolean <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> snapshot,
+<pre>public static boolean <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> snapshot,
<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> user)</pre>
<div class="block">Check if the user is this table snapshot's owner</div>
<dl>
@@ -985,7 +942,7 @@ public static final <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockList">
<li class="blockList">
<h4>isSecurityAvailable</h4>
-<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.428">isSecurityAvailable</a>(org.apache.hadoop.conf.Configuration conf)
+<pre>public static boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.416">isSecurityAvailable</a>(org.apache.hadoop.conf.Configuration 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 <a href="https://docs.oracle.com/javase/8/docs/api/java
<ul class="blockListLast">
<li class="blockList">
<h4>writeAclToSnapshotDescription</h4>
-<pre>private static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.436">writeAclToSnapshotDescription</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
+<pre>private static org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription <a href="../../../../../src-html/org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.html#line.424">writeAclToSnapshotDescription</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription snapshot,
org.apache.hadoop.conf.Configuration 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"> </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"> </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"> </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"> </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"> </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><<a href="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"><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"> </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><<a href="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"><span class="typeNameLabel">SnapshotManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html#getLocks--">getLocks</a></span>()</code> </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<Pair<RegionInfo, ServerName>> 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<String> serverNames = new HashSet<>();<a name="line.210"></a>
-<span class="sourceLineNo">211</span> for (Pair<RegionInfo, ServerName> p : regionsAndLocations) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span> if (p != null && p.getFirst() != null && 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() && (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)) && !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> * <p/><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<Pair<RegionInfo, ServerName>> 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<Pair<RegionInfo, ServerName>> 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<String> serverNames = new HashSet<>();<a name="line.208"></a>
+<span class="sourceLineNo">209</span> for (Pair<RegionInfo, ServerName> p : regionsAndLocations) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span> if (p != null && p.getFirst() != null && 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() && (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)) && !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> * <p/><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<Pair<RegionInfo, ServerName>> 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 –
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 –
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 – 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="" /> Warnings</th>
<th><img src="images/icon_error_sml.gif" alt="" /> 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>"2"</tt></li></ul></td>
-<td>731</td>
+<td>730</td>
<td><img src="images/icon_error_sml.gif" alt="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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>©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 –
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 – 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 – 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 – 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 – 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 static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"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 static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/Version.html#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 static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
-<td><code><a href="org/apache/hadoop/hbase/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 static final 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 static final 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 static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/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 static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/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 static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td><code><a href="org/apache/hadoop/hbase/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 static final <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
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<Path>)</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> </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> </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> </dd>
@@ -53007,6 +53001,8 @@
<dd> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/util/DelayedUtil.html#takeWithoutInterrupt-java.util.concurrent.DelayQueue-">takeWithoutInterrupt(DelayQueue<E>)</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> </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> </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 <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html#line.309">RefreshCacheTask</a>()</pre>
+<pre>public <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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.RefreshCacheTask.html#line.311">run</a>()</pre>
+<pre>public void <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> in interface <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><<a href="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/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><<a href="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/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 <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.341">SnapshotDirectoryInfo</a>(long mtime,
+<pre>public <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.349">SnapshotDirectoryInfo</a>(long 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><<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a><<a href="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/SnapshotFileCache.SnapshotDirectoryInfo.html#line.349">getFiles</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a><<a href="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/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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.359">hasBeenModified</a>(long mtime)</pre>
+<pre>public boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.SnapshotDirectoryInfo.html#line.367">hasBeenModified</a>(long 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><<a href="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/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> snapshotManager)</code> </td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#getSnapshotsInProgress--">getSnapshotsInProgress</a></span>()</code> </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><org.apache.hadoop.fs.FileStatus></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 void <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.207">refreshCache</a>()
+<pre>private void <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><<a href="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/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> 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><<a href="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/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 void <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> why)</pre>
+<pre>public void <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> why)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface: <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 boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.html#line.330">isStopped</a>()</pre>
+<pre>public boolean <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> in interface <code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></code></dd>