http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f96628d5/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/Cipher.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/Cipher.html 
b/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/Cipher.html
index 343f712..57d7efe 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/Cipher.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/Cipher.html
@@ -39,95 +39,103 @@
 <span class="sourceLineNo">031</span>@InterfaceStability.Evolving<a 
name="line.31"></a>
 <span class="sourceLineNo">032</span>public abstract class Cipher {<a 
name="line.32"></a>
 <span class="sourceLineNo">033</span><a name="line.33"></a>
-<span class="sourceLineNo">034</span>  private final CipherProvider 
provider;<a name="line.34"></a>
-<span class="sourceLineNo">035</span><a name="line.35"></a>
-<span class="sourceLineNo">036</span>  public Cipher(CipherProvider provider) 
{<a name="line.36"></a>
-<span class="sourceLineNo">037</span>    this.provider = provider;<a 
name="line.37"></a>
-<span class="sourceLineNo">038</span>  }<a name="line.38"></a>
-<span class="sourceLineNo">039</span><a name="line.39"></a>
-<span class="sourceLineNo">040</span>  /**<a name="line.40"></a>
-<span class="sourceLineNo">041</span>   * Return the provider for this 
Cipher<a name="line.41"></a>
-<span class="sourceLineNo">042</span>   */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>  public CipherProvider getProvider() {<a 
name="line.43"></a>
-<span class="sourceLineNo">044</span>    return provider;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  }<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  /**<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   * Return this Cipher's name<a 
name="line.48"></a>
-<span class="sourceLineNo">049</span>   */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  public abstract String getName();<a 
name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>  /**<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   * Return the key length required by 
this cipher, in bytes<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public abstract int getKeyLength();<a 
name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>  /**<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   * Return the expected initialization 
vector length, in bytes, or 0 if not applicable<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   */<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  public abstract int getIvLength();<a 
name="line.60"></a>
-<span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>  /**<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * Create a random symmetric key<a 
name="line.63"></a>
-<span class="sourceLineNo">064</span>   * @return the random symmetric key<a 
name="line.64"></a>
-<span class="sourceLineNo">065</span>   */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public abstract Key getRandomKey();<a 
name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /**<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * Get an encryptor for encrypting 
data.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   */<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  public abstract Encryptor 
getEncryptor();<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  /**<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * Return a decryptor for decrypting 
data.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  public abstract Decryptor 
getDecryptor();<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * Create an encrypting output stream 
given a context and IV<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * @param out the output stream to 
wrap<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * @param context the encryption 
context<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   * @param iv initialization vector<a 
name="line.82"></a>
-<span class="sourceLineNo">083</span>   * @return the encrypting wrapper<a 
name="line.83"></a>
-<span class="sourceLineNo">084</span>   * @throws IOException<a 
name="line.84"></a>
-<span class="sourceLineNo">085</span>   */<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public abstract OutputStream 
createEncryptionStream(OutputStream out, Context context,<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      byte[] iv)<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    throws IOException;<a 
name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   * Create an encrypting output stream 
given an initialized encryptor<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * @param out the output stream to 
wrap<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param encryptor the encryptor<a 
name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @return the encrypting wrapper<a 
name="line.94"></a>
-<span class="sourceLineNo">095</span>   * @throws IOException<a 
name="line.95"></a>
-<span class="sourceLineNo">096</span>   */<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  public abstract OutputStream 
createEncryptionStream(OutputStream out, Encryptor encryptor)<a 
name="line.97"></a>
-<span class="sourceLineNo">098</span>    throws IOException;<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>   * Create a decrypting input stream 
given a context and IV<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * @param in the input stream to wrap<a 
name="line.102"></a>
-<span class="sourceLineNo">103</span>   * @param context the encryption 
context<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param iv initialization vector<a 
name="line.104"></a>
-<span class="sourceLineNo">105</span>   * @return the decrypting wrapper<a 
name="line.105"></a>
-<span class="sourceLineNo">106</span>   * @throws IOException<a 
name="line.106"></a>
-<span class="sourceLineNo">107</span>   */<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public abstract InputStream 
createDecryptionStream(InputStream in, Context context,<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      byte[] iv)<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    throws IOException;<a 
name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  /**<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * Create a decrypting output stream 
given an initialized decryptor<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * @param in the input stream to wrap<a 
name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param decryptor the decryptor<a 
name="line.115"></a>
-<span class="sourceLineNo">116</span>   * @return the decrypting wrapper<a 
name="line.116"></a>
-<span class="sourceLineNo">117</span>   * @throws IOException<a 
name="line.117"></a>
-<span class="sourceLineNo">118</span>   */<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  public abstract InputStream 
createDecryptionStream(InputStream in, Decryptor decryptor)<a 
name="line.119"></a>
-<span class="sourceLineNo">120</span>    throws IOException;<a 
name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>}<a name="line.122"></a>
+<span class="sourceLineNo">034</span>  public static final int KEY_LENGTH = 
16;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>  public static final int KEY_LENGTH_BITS 
= KEY_LENGTH * 8;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>  public static final int BLOCK_SIZE = 
16;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  public static final int IV_LENGTH = 
16;<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  public static final String 
RNG_ALGORITHM_KEY = "hbase.crypto.algorithm.rng";<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final String 
RNG_PROVIDER_KEY = "hbase.crypto.algorithm.rng.provider";<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  private final CipherProvider 
provider;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>  public Cipher(CipherProvider provider) 
{<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    this.provider = provider;<a 
name="line.45"></a>
+<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>   * Return the provider for this 
Cipher<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  public CipherProvider getProvider() {<a 
name="line.51"></a>
+<span class="sourceLineNo">052</span>    return provider;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  /**<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   * Return this Cipher's name<a 
name="line.56"></a>
+<span class="sourceLineNo">057</span>   */<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  public abstract String getName();<a 
name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  /**<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   * Return the key length required by 
this cipher, in bytes<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  public abstract int getKeyLength();<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>   * Return the expected initialization 
vector length, in bytes, or 0 if not applicable<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  public abstract int getIvLength();<a 
name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * Create a random symmetric key<a 
name="line.71"></a>
+<span class="sourceLineNo">072</span>   * @return the random symmetric key<a 
name="line.72"></a>
+<span class="sourceLineNo">073</span>   */<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  public abstract Key getRandomKey();<a 
name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  /**<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * Get an encryptor for encrypting 
data.<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  public abstract Encryptor 
getEncryptor();<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>  /**<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * Return a decryptor for decrypting 
data.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  public abstract Decryptor 
getDecryptor();<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * Create an encrypting output stream 
given a context and IV<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * @param out the output stream to 
wrap<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * @param context the encryption 
context<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @param iv initialization vector<a 
name="line.90"></a>
+<span class="sourceLineNo">091</span>   * @return the encrypting wrapper<a 
name="line.91"></a>
+<span class="sourceLineNo">092</span>   * @throws IOException<a 
name="line.92"></a>
+<span class="sourceLineNo">093</span>   */<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public abstract OutputStream 
createEncryptionStream(OutputStream out, Context context,<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      byte[] iv)<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    throws IOException;<a 
name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  /**<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * Create an encrypting output stream 
given an initialized encryptor<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * @param out the output stream to 
wrap<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param encryptor the encryptor<a 
name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @return the encrypting wrapper<a 
name="line.102"></a>
+<span class="sourceLineNo">103</span>   * @throws IOException<a 
name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public abstract OutputStream 
createEncryptionStream(OutputStream out, Encryptor encryptor)<a 
name="line.105"></a>
+<span class="sourceLineNo">106</span>    throws IOException;<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>   * Create a decrypting input stream 
given a context and IV<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * @param in the input stream to wrap<a 
name="line.110"></a>
+<span class="sourceLineNo">111</span>   * @param context the encryption 
context<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * @param iv initialization vector<a 
name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @return the decrypting wrapper<a 
name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @throws IOException<a 
name="line.114"></a>
+<span class="sourceLineNo">115</span>   */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public abstract InputStream 
createDecryptionStream(InputStream in, Context context,<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      byte[] iv)<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    throws IOException;<a 
name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  /**<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * Create a decrypting output stream 
given an initialized decryptor<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @param in the input stream to wrap<a 
name="line.122"></a>
+<span class="sourceLineNo">123</span>   * @param decryptor the decryptor<a 
name="line.123"></a>
+<span class="sourceLineNo">124</span>   * @return the decrypting wrapper<a 
name="line.124"></a>
+<span class="sourceLineNo">125</span>   * @throws IOException<a 
name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public abstract InputStream 
createDecryptionStream(InputStream in, Decryptor decryptor)<a 
name="line.127"></a>
+<span class="sourceLineNo">128</span>    throws IOException;<a 
name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>}<a name="line.130"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f96628d5/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/CryptoCipherProvider.html
----------------------------------------------------------------------
diff --git 
a/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/CryptoCipherProvider.html 
b/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/CryptoCipherProvider.html
new file mode 100644
index 0000000..a3fd658
--- /dev/null
+++ 
b/apidocs/src-html/org/apache/hadoop/hbase/io/crypto/CryptoCipherProvider.html
@@ -0,0 +1,148 @@
+<!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 or more<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * contributor license agreements. See 
the NOTICE file distributed with this<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * work for additional information 
regarding copyright ownership. The ASF<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * licenses this file to you under the 
Apache License, Version 2.0 (the<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * "License"); you may not use this file 
except in compliance with the License.<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * You may obtain a copy of the License 
at<a name="line.7"></a>
+<span class="sourceLineNo">008</span> *<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * 
http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *<a name="line.10"></a>
+<span class="sourceLineNo">011</span> * Unless required by applicable law or 
agreed to in writing, software<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * distributed under the License is 
distributed on an "AS IS" BASIS, WITHOUT<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * WARRANTIES OR CONDITIONS OF ANY KIND, 
either express or implied. See the<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * License for the specific language 
governing permissions and limitations under<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * the License.<a name="line.15"></a>
+<span class="sourceLineNo">016</span> */<a name="line.16"></a>
+<span class="sourceLineNo">017</span>package 
org.apache.hadoop.hbase.io.crypto;<a name="line.17"></a>
+<span class="sourceLineNo">018</span><a name="line.18"></a>
+<span class="sourceLineNo">019</span>import 
org.apache.hadoop.conf.Configuration;<a name="line.19"></a>
+<span class="sourceLineNo">020</span>import 
org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import 
org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import 
org.apache.hadoop.hbase.classification.InterfaceStability;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import 
org.apache.hadoop.hbase.io.crypto.aes.CommonsCryptoAES;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>/**<a name="line.25"></a>
+<span class="sourceLineNo">026</span> * The default cipher provider. Supports 
AES via the Commons Crypto.<a name="line.26"></a>
+<span class="sourceLineNo">027</span> */<a name="line.27"></a>
+<span class="sourceLineNo">028</span>@InterfaceAudience.Public<a 
name="line.28"></a>
+<span class="sourceLineNo">029</span>@InterfaceStability.Evolving<a 
name="line.29"></a>
+<span class="sourceLineNo">030</span>public final class CryptoCipherProvider 
implements CipherProvider {<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>  private static CryptoCipherProvider 
instance;<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>  public static CryptoCipherProvider 
getInstance() {<a name="line.34"></a>
+<span class="sourceLineNo">035</span>    if (instance != null) {<a 
name="line.35"></a>
+<span class="sourceLineNo">036</span>      return instance;<a 
name="line.36"></a>
+<span class="sourceLineNo">037</span>    }<a name="line.37"></a>
+<span class="sourceLineNo">038</span>    instance = new 
CryptoCipherProvider();<a name="line.38"></a>
+<span class="sourceLineNo">039</span>    return instance;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  }<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  private Configuration conf = 
HBaseConfiguration.create();<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>  // Prevent instantiation<a 
name="line.44"></a>
+<span class="sourceLineNo">045</span>  private CryptoCipherProvider() { }<a 
name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>  @Override<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  public Configuration getConf() {<a 
name="line.48"></a>
+<span class="sourceLineNo">049</span>    return conf;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  }<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  @Override<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  public void setConf(Configuration conf) 
{<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    this.conf = conf;<a 
name="line.54"></a>
+<span class="sourceLineNo">055</span>  }<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  @Override<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  public String getName() {<a 
name="line.58"></a>
+<span class="sourceLineNo">059</span>    return "commons";<a 
name="line.59"></a>
+<span class="sourceLineNo">060</span>  }<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  @Override<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  public Cipher getCipher(String name) 
{<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    if (name.equalsIgnoreCase("AES")) {<a 
name="line.64"></a>
+<span class="sourceLineNo">065</span>      return new 
CommonsCryptoAES(this);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    }<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    throw new RuntimeException("Cipher '" 
+ name + "' is not supported by provider '" +<a name="line.67"></a>
+<span class="sourceLineNo">068</span>        getName() + "'");<a 
name="line.68"></a>
+<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  @Override<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  public String[] getSupportedCiphers() 
{<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    return new String[] { "AES" };<a 
name="line.73"></a>
+<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>}<a name="line.76"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f96628d5/apidocs/src-html/org/apache/hadoop/hbase/ipc/UnsupportedCryptoException.html
----------------------------------------------------------------------
diff --git 
a/apidocs/src-html/org/apache/hadoop/hbase/ipc/UnsupportedCryptoException.html 
b/apidocs/src-html/org/apache/hadoop/hbase/ipc/UnsupportedCryptoException.html
new file mode 100644
index 0000000..42726e0
--- /dev/null
+++ 
b/apidocs/src-html/org/apache/hadoop/hbase/ipc/UnsupportedCryptoException.html
@@ -0,0 +1,110 @@
+<!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.ipc;<a 
name="line.19"></a>
+<span class="sourceLineNo">020</span><a name="line.20"></a>
+<span class="sourceLineNo">021</span>import 
org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import 
org.apache.hadoop.hbase.classification.InterfaceStability;<a name="line.22"></a>
+<span class="sourceLineNo">023</span><a name="line.23"></a>
+<span class="sourceLineNo">024</span>@InterfaceAudience.Public<a 
name="line.24"></a>
+<span class="sourceLineNo">025</span>@InterfaceStability.Evolving<a 
name="line.25"></a>
+<span class="sourceLineNo">026</span>public class UnsupportedCryptoException 
extends FatalConnectionException {<a name="line.26"></a>
+<span class="sourceLineNo">027</span>  public UnsupportedCryptoException() {<a 
name="line.27"></a>
+<span class="sourceLineNo">028</span>    super();<a name="line.28"></a>
+<span class="sourceLineNo">029</span>  }<a name="line.29"></a>
+<span class="sourceLineNo">030</span><a name="line.30"></a>
+<span class="sourceLineNo">031</span>  public 
UnsupportedCryptoException(String msg) {<a name="line.31"></a>
+<span class="sourceLineNo">032</span>    super(msg);<a name="line.32"></a>
+<span class="sourceLineNo">033</span>  }<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>  public 
UnsupportedCryptoException(String msg, Throwable t) {<a name="line.35"></a>
+<span class="sourceLineNo">036</span>    super(msg, t);<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  }<a name="line.37"></a>
+<span class="sourceLineNo">038</span>}<a name="line.38"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f96628d5/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
----------------------------------------------------------------------
diff --git 
a/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html 
b/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
index 126b093..97b4906 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapred/TableOutputFormat.html
@@ -63,69 +63,82 @@
 <span class="sourceLineNo">055</span>    private BufferedMutator m_mutator;<a 
name="line.55"></a>
 <span class="sourceLineNo">056</span>    private Connection conn;<a 
name="line.56"></a>
 <span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>    /**<a name="line.58"></a>
-<span class="sourceLineNo">059</span>     * Instantiate a TableRecordWriter 
with a BufferedMutator for batch writing.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>     */<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    public TableRecordWriter(JobConf job) 
throws IOException {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      // expecting exactly one path<a 
name="line.62"></a>
-<span class="sourceLineNo">063</span>      TableName tableName = 
TableName.valueOf(job.get(OUTPUT_TABLE));<a name="line.63"></a>
-<span class="sourceLineNo">064</span>      try {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>        this.conn = 
ConnectionFactory.createConnection(job);<a name="line.65"></a>
-<span class="sourceLineNo">066</span>        this.m_mutator = 
conn.getBufferedMutator(tableName);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      } finally {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>        if (this.m_mutator == null) {<a 
name="line.68"></a>
-<span class="sourceLineNo">069</span>          conn.close();<a 
name="line.69"></a>
-<span class="sourceLineNo">070</span>          conn = null;<a 
name="line.70"></a>
-<span class="sourceLineNo">071</span>        }<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      }<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    }<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    public void close(Reporter reporter) 
throws IOException {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      if (this.m_mutator != null) {<a 
name="line.76"></a>
-<span class="sourceLineNo">077</span>        this.m_mutator.close();<a 
name="line.77"></a>
-<span class="sourceLineNo">078</span>      }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      if (conn != null) {<a 
name="line.79"></a>
-<span class="sourceLineNo">080</span>        this.conn.close();<a 
name="line.80"></a>
-<span class="sourceLineNo">081</span>      }<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public void 
write(ImmutableBytesWritable key, Put value) throws IOException {<a 
name="line.84"></a>
-<span class="sourceLineNo">085</span>      m_mutator.mutate(new Put(value));<a 
name="line.85"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>    /**<a name="line.59"></a>
+<span class="sourceLineNo">060</span>     * Instantiate a TableRecordWriter 
with the HBase HClient for writing.<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     *<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     * @deprecated Please use {@code 
#TableRecordWriter(JobConf)}  This version does not clean up<a 
name="line.62"></a>
+<span class="sourceLineNo">063</span>     * connections and will leak 
connections (removed in 2.0)<a name="line.63"></a>
+<span class="sourceLineNo">064</span>     */<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @Deprecated<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    public TableRecordWriter(final 
BufferedMutator mutator) throws IOException {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      this.m_mutator = mutator;<a 
name="line.67"></a>
+<span class="sourceLineNo">068</span>      this.conn = null;<a 
name="line.68"></a>
+<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>    /**<a name="line.71"></a>
+<span class="sourceLineNo">072</span>     * Instantiate a TableRecordWriter 
with a BufferedMutator for batch writing.<a name="line.72"></a>
+<span class="sourceLineNo">073</span>     */<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    public TableRecordWriter(JobConf job) 
throws IOException {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      // expecting exactly one path<a 
name="line.75"></a>
+<span class="sourceLineNo">076</span>      TableName tableName = 
TableName.valueOf(job.get(OUTPUT_TABLE));<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      try {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        this.conn = 
ConnectionFactory.createConnection(job);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        this.m_mutator = 
conn.getBufferedMutator(tableName);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      } finally {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        if (this.m_mutator == null) {<a 
name="line.81"></a>
+<span class="sourceLineNo">082</span>          conn.close();<a 
name="line.82"></a>
+<span class="sourceLineNo">083</span>          conn = null;<a 
name="line.83"></a>
+<span class="sourceLineNo">084</span>        }<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      }<a name="line.85"></a>
 <span class="sourceLineNo">086</span>    }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  /**<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * Creates a new record writer.<a 
name="line.90"></a>
-<span class="sourceLineNo">091</span>   * <a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * Be aware that the baseline javadoc 
gives the impression that there is a single<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * {@link RecordWriter} per job but in 
HBase, it is more natural if we give you a new<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * RecordWriter per call of this 
method. You must close the returned RecordWriter when done.<a 
name="line.94"></a>
-<span class="sourceLineNo">095</span>   * Failure to do so will drop writes.<a 
name="line.95"></a>
-<span class="sourceLineNo">096</span>   *<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * @param ignored Ignored filesystem<a 
name="line.97"></a>
-<span class="sourceLineNo">098</span>   * @param job Current JobConf<a 
name="line.98"></a>
-<span class="sourceLineNo">099</span>   * @param name Name of the job<a 
name="line.99"></a>
-<span class="sourceLineNo">100</span>   * @param progress<a 
name="line.100"></a>
-<span class="sourceLineNo">101</span>   * @return The newly created writer 
instance.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * @throws IOException When creating 
the writer fails.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  @Override<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public RecordWriter 
getRecordWriter(FileSystem ignored, JobConf job, String name,<a 
name="line.105"></a>
-<span class="sourceLineNo">106</span>      Progressable progress)<a 
name="line.106"></a>
-<span class="sourceLineNo">107</span>  throws IOException {<a 
name="line.107"></a>
-<span class="sourceLineNo">108</span>    // Clear write buffer on fail is true 
by default so no need to reset it.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    return new TableRecordWriter(job);<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>  @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  public void checkOutputSpecs(FileSystem 
ignored, JobConf job)<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  throws FileAlreadyExistsException, 
InvalidJobConfException, IOException {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    String tableName = 
job.get(OUTPUT_TABLE);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    if (tableName == null) {<a 
name="line.116"></a>
-<span class="sourceLineNo">117</span>      throw new IOException("Must specify 
table name");<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>}<a name="line.120"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void close(Reporter reporter) 
throws IOException {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      if (this.m_mutator != null) {<a 
name="line.89"></a>
+<span class="sourceLineNo">090</span>        this.m_mutator.close();<a 
name="line.90"></a>
+<span class="sourceLineNo">091</span>      }<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      if (conn != null) {<a 
name="line.92"></a>
+<span class="sourceLineNo">093</span>        this.conn.close();<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><a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public void 
write(ImmutableBytesWritable key, Put value) throws IOException {<a 
name="line.97"></a>
+<span class="sourceLineNo">098</span>      m_mutator.mutate(new Put(value));<a 
name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  /**<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * Creates a new record writer.<a 
name="line.103"></a>
+<span class="sourceLineNo">104</span>   * <a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * Be aware that the baseline javadoc 
gives the impression that there is a single<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * {@link RecordWriter} per job but in 
HBase, it is more natural if we give you a new<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * RecordWriter per call of this 
method. You must close the returned RecordWriter when done.<a 
name="line.107"></a>
+<span class="sourceLineNo">108</span>   * Failure to do so will drop writes.<a 
name="line.108"></a>
+<span class="sourceLineNo">109</span>   *<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * @param ignored Ignored filesystem<a 
name="line.110"></a>
+<span class="sourceLineNo">111</span>   * @param job Current JobConf<a 
name="line.111"></a>
+<span class="sourceLineNo">112</span>   * @param name Name of the job<a 
name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param progress<a 
name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @return The newly created writer 
instance.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @throws IOException When creating 
the writer fails.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  @Override<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public RecordWriter 
getRecordWriter(FileSystem ignored, JobConf job, String name,<a 
name="line.118"></a>
+<span class="sourceLineNo">119</span>      Progressable progress)<a 
name="line.119"></a>
+<span class="sourceLineNo">120</span>  throws IOException {<a 
name="line.120"></a>
+<span class="sourceLineNo">121</span>    // Clear write buffer on fail is true 
by default so no need to reset it.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return new TableRecordWriter(job);<a 
name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><a name="line.124"></a>
+<span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public void checkOutputSpecs(FileSystem 
ignored, JobConf job)<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  throws FileAlreadyExistsException, 
InvalidJobConfException, IOException {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    String tableName = 
job.get(OUTPUT_TABLE);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    if (tableName == null) {<a 
name="line.129"></a>
+<span class="sourceLineNo">130</span>      throw new IOException("Must specify 
table name");<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  }<a name="line.132"></a>
+<span class="sourceLineNo">133</span>}<a name="line.133"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f96628d5/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RowCounter.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RowCounter.html 
b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RowCounter.html
index e209a48..87c73d9 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RowCounter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RowCounter.html
@@ -215,70 +215,65 @@
 <span class="sourceLineNo">207</span>      
scan.setStartRow(range.getStartRow()); //inclusive<a name="line.207"></a>
 <span class="sourceLineNo">208</span>      
scan.setStopRow(range.getStopRow());   //exclusive<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    } else if (size &gt; 1) {<a 
name="line.209"></a>
-<span class="sourceLineNo">210</span>      try {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        scan.setFilter(new 
MultiRowRangeFilter(rowRangeList));<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      } catch (IOException e) {<a 
name="line.212"></a>
-<span class="sourceLineNo">213</span>        //the IOException should never be 
thrown. see HBASE-16145<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        throw new 
RuntimeException("Cannot instantiate MultiRowRangeFilter");<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><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /*<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * @param errorMessage Can attach a 
message when error occurs.<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   */<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  private static void printUsage(String 
errorMessage) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    System.err.println("ERROR: " + 
errorMessage);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    printUsage();<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>   * Prints usage without error 
message.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * Note that we don't document 
--expected-count, because it's intended for test.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  private static void printUsage() {<a 
name="line.231"></a>
-<span class="sourceLineNo">232</span>    System.err.println("Usage: RowCounter 
[options] &lt;tablename&gt; " +<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        "[--starttime=[start] 
--endtime=[end] " +<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        
"[--range=[startKey],[endKey][;[startKey],[endKey]...]] [&lt;column1&gt; 
&lt;column2&gt;...]");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    System.err.println("For performance 
consider the following options:\n"<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        + 
"-Dhbase.client.scanner.caching=100\n"<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        + 
"-Dmapreduce.map.speculative=false");<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>  @Override<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  public int run(String[] args) throws 
Exception {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    if (args.length &lt; 1) {<a 
name="line.242"></a>
-<span class="sourceLineNo">243</span>      printUsage("Wrong number of 
parameters: " + args.length);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return -1;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Job job = 
createSubmittableJob(getConf(), args);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    if (job == null) {<a 
name="line.247"></a>
-<span class="sourceLineNo">248</span>      return -1;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    boolean success = 
job.waitForCompletion(true);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    final long expectedCount = 
getConf().getLong(EXPECTED_COUNT_KEY, -1);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    if (success &amp;&amp; expectedCount 
!= -1) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      final Counter counter = 
job.getCounters().findCounter(RowCounterMapper.Counters.ROWS);<a 
name="line.253"></a>
-<span class="sourceLineNo">254</span>      success = expectedCount == 
counter.getValue();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      if (!success) {<a 
name="line.255"></a>
-<span class="sourceLineNo">256</span>        LOG.error("Failing job because 
count of '" + counter.getValue() +<a name="line.256"></a>
-<span class="sourceLineNo">257</span>            "' does not match expected 
count of '" + expectedCount + "'");<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>    return (success ? 0 : 1);<a 
name="line.260"></a>
-<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   * Main entry point.<a 
name="line.264"></a>
-<span class="sourceLineNo">265</span>   * @param args The command line 
parameters.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * @throws Exception When running the 
job fails.<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  public static void main(String[] args) 
throws Exception {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    int errCode = 
ToolRunner.run(HBaseConfiguration.create(), new RowCounter(), args);<a 
name="line.269"></a>
-<span class="sourceLineNo">270</span>    System.exit(errCode);<a 
name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>}<a name="line.273"></a>
+<span class="sourceLineNo">210</span>      scan.setFilter(new 
MultiRowRangeFilter(rowRangeList));<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /*<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param errorMessage Can attach a 
message when error occurs.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  private static void printUsage(String 
errorMessage) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    System.err.println("ERROR: " + 
errorMessage);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    printUsage();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  /**<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Prints usage without error 
message.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Note that we don't document 
--expected-count, because it's intended for test.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  private static void printUsage() {<a 
name="line.226"></a>
+<span class="sourceLineNo">227</span>    System.err.println("Usage: RowCounter 
[options] &lt;tablename&gt; " +<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        "[--starttime=[start] 
--endtime=[end] " +<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        
"[--range=[startKey],[endKey][;[startKey],[endKey]...]] [&lt;column1&gt; 
&lt;column2&gt;...]");<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    System.err.println("For performance 
consider the following options:\n"<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        + 
"-Dhbase.client.scanner.caching=100\n"<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        + 
"-Dmapreduce.map.speculative=false");<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public int run(String[] args) throws 
Exception {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    if (args.length &lt; 1) {<a 
name="line.237"></a>
+<span class="sourceLineNo">238</span>      printUsage("Wrong number of 
parameters: " + args.length);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      return -1;<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    Job job = 
createSubmittableJob(getConf(), args);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    if (job == null) {<a 
name="line.242"></a>
+<span class="sourceLineNo">243</span>      return -1;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    boolean success = 
job.waitForCompletion(true);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    final long expectedCount = 
getConf().getLong(EXPECTED_COUNT_KEY, -1);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (success &amp;&amp; expectedCount 
!= -1) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final Counter counter = 
job.getCounters().findCounter(RowCounterMapper.Counters.ROWS);<a 
name="line.248"></a>
+<span class="sourceLineNo">249</span>      success = expectedCount == 
counter.getValue();<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      if (!success) {<a 
name="line.250"></a>
+<span class="sourceLineNo">251</span>        LOG.error("Failing job because 
count of '" + counter.getValue() +<a name="line.251"></a>
+<span class="sourceLineNo">252</span>            "' does not match expected 
count of '" + expectedCount + "'");<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>    return (success ? 0 : 1);<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>   * Main entry point.<a 
name="line.259"></a>
+<span class="sourceLineNo">260</span>   * @param args The command line 
parameters.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * @throws Exception When running the 
job fails.<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
+<span class="sourceLineNo">263</span>  public static void main(String[] args) 
throws Exception {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    int errCode = 
ToolRunner.run(HBaseConfiguration.create(), new RowCounter(), args);<a 
name="line.264"></a>
+<span class="sourceLineNo">265</span>    System.exit(errCode);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f96628d5/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git 
a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html 
b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index aa0d64e..99a2002 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -947,149 +947,168 @@
 <span class="sourceLineNo">939</span>    Path outputSnapshotDir = 
SnapshotDescriptionUtils.getCompletedSnapshotDir(targetName, outputRoot);<a 
name="line.939"></a>
 <span class="sourceLineNo">940</span>    Path initialOutputSnapshotDir = 
skipTmp ? outputSnapshotDir : snapshotTmpDir;<a name="line.940"></a>
 <span class="sourceLineNo">941</span><a name="line.941"></a>
-<span class="sourceLineNo">942</span>    // Check if the snapshot already 
exists<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    if 
(outputFs.exists(outputSnapshotDir)) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      if (overwrite) {<a 
name="line.944"></a>
-<span class="sourceLineNo">945</span>        if 
(!outputFs.delete(outputSnapshotDir, true)) {<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          System.err.println("Unable to 
remove existing snapshot directory: " + outputSnapshotDir);<a 
name="line.946"></a>
-<span class="sourceLineNo">947</span>          return 1;<a name="line.947"></a>
-<span class="sourceLineNo">948</span>        }<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      } else {<a name="line.949"></a>
-<span class="sourceLineNo">950</span>        System.err.println("The snapshot 
'" + targetName +<a name="line.950"></a>
-<span class="sourceLineNo">951</span>          "' already exists in the 
destination: " + outputSnapshotDir);<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        return 1;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      }<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    if (!skipTmp) {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      // Check if the snapshot already 
in-progress<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      if 
(outputFs.exists(snapshotTmpDir)) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>        if (overwrite) {<a 
name="line.959"></a>
-<span class="sourceLineNo">960</span>          if 
(!outputFs.delete(snapshotTmpDir, true)) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>            System.err.println("Unable to 
remove existing snapshot tmp directory: "+snapshotTmpDir);<a 
name="line.961"></a>
-<span class="sourceLineNo">962</span>            return 1;<a 
name="line.962"></a>
-<span class="sourceLineNo">963</span>          }<a name="line.963"></a>
-<span class="sourceLineNo">964</span>        } else {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>          System.err.println("A snapshot 
with the same name '"+ targetName +"' may be in-progress");<a 
name="line.965"></a>
-<span class="sourceLineNo">966</span>          System.err.println("Please 
check "+snapshotTmpDir+". If the snapshot has completed, ");<a 
name="line.966"></a>
-<span class="sourceLineNo">967</span>          System.err.println("consider 
removing "+snapshotTmpDir+" by using the -overwrite option");<a 
name="line.967"></a>
-<span class="sourceLineNo">968</span>          return 1;<a name="line.968"></a>
-<span class="sourceLineNo">969</span>        }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>      }<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    }<a name="line.971"></a>
-<span class="sourceLineNo">972</span><a name="line.972"></a>
-<span class="sourceLineNo">973</span>    // Step 1 - Copy 
fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a 
name="line.973"></a>
-<span class="sourceLineNo">974</span>    // The snapshot references must be 
copied before the hfiles otherwise the cleaner<a name="line.974"></a>
-<span class="sourceLineNo">975</span>    // will remove them because they are 
unreferenced.<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    try {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      LOG.info("Copy Snapshot 
Manifest");<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      FileUtil.copy(inputFs, snapshotDir, 
outputFs, initialOutputSnapshotDir, false, false, conf);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      if (filesUser != null || filesGroup 
!= null) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>        setOwner(outputFs, 
snapshotTmpDir, filesUser, filesGroup, true);<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      }<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      if (filesMode &gt; 0) {<a 
name="line.982"></a>
-<span class="sourceLineNo">983</span>        setPermission(outputFs, 
snapshotTmpDir, (short)filesMode, true);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      }<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    } catch (IOException e) {<a 
name="line.985"></a>
-<span class="sourceLineNo">986</span>      throw new 
ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a 
name="line.986"></a>
-<span class="sourceLineNo">987</span>        snapshotDir + " to=" + 
initialOutputSnapshotDir, e);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
-<span class="sourceLineNo">989</span><a name="line.989"></a>
-<span class="sourceLineNo">990</span>    // Write a new .snapshotinfo if the 
target name is different from the source name<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (!targetName.equals(snapshotName)) 
{<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      SnapshotDescription snapshotDesc 
=<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        
SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a 
name="line.993"></a>
-<span class="sourceLineNo">994</span>          .toBuilder()<a 
name="line.994"></a>
-<span class="sourceLineNo">995</span>          .setName(targetName)<a 
name="line.995"></a>
-<span class="sourceLineNo">996</span>          .build();<a name="line.996"></a>
-<span class="sourceLineNo">997</span>      
SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, snapshotTmpDir, 
outputFs);<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    // Step 2 - Start MR Job to copy 
files<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    // The snapshot references must be 
copied before the files otherwise the files gets removed<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    // by the HFileArchiver, since they 
have no references.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    try {<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      runCopyJob(inputRoot, outputRoot, 
snapshotName, snapshotDir, verifyChecksum,<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>                 filesUser, filesGroup, 
filesMode, mappers, bandwidthMB);<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span><a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.info("Finalize the Snapshot 
Export");<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      if (!skipTmp) {<a 
name="line.1008"></a>
-<span class="sourceLineNo">1009</span>        // Step 3 - Rename 
fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a 
name="line.1009"></a>
-<span class="sourceLineNo">1010</span>        if 
(!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>          throw new 
ExportSnapshotException("Unable to rename snapshot directory from=" +<a 
name="line.1011"></a>
-<span class="sourceLineNo">1012</span>            snapshotTmpDir + " to=" + 
outputSnapshotDir);<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        }<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      }<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span><a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>      // Step 4 - Verify snapshot 
integrity<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>      if (verifyTarget) {<a 
name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        LOG.info("Verify snapshot 
integrity");<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        verifySnapshot(destConf, 
outputFs, outputRoot, outputSnapshotDir);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      LOG.info("Export Completed: " + 
targetName);<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      return 0;<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    } catch (Exception e) {<a 
name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      LOG.error("Snapshot export 
failed", e);<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>      if (!skipTmp) {<a 
name="line.1026"></a>
-<span class="sourceLineNo">1027</span>        outputFs.delete(snapshotTmpDir, 
true);<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      outputFs.delete(outputSnapshotDir, 
true);<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      return 1;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    } finally {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>      IOUtils.closeStream(inputFs);<a 
name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      IOUtils.closeStream(outputFs);<a 
name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    }<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>  }<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span><a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>  // ExportSnapshot<a 
name="line.1037"></a>
-<span class="sourceLineNo">1038</span>  private void printUsageAndExit() {<a 
name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    System.err.printf("Usage: bin/hbase 
%s [options]%n", getClass().getName());<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    System.err.println(" where [options] 
are:");<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    System.err.println("  -h|-help       
         Show this help and exit.");<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    System.err.println("  -snapshot NAME 
         Snapshot to restore.");<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    System.err.println("  -copy-to NAME  
         Remote destination hdfs://");<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    System.err.println("  -copy-from 
NAME         Input folder hdfs:// (default hbase.rootdir)");<a 
name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    System.err.println("  
-no-checksum-verify     Do not verify checksum, use name+length only.");<a 
name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    System.err.println("  
-no-target-verify       Do not verify the integrity of the \\" +<a 
name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        "exported snapshot.");<a 
name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    System.err.println("  -overwrite     
         Rewrite the snapshot manifest if already exists");<a 
name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    System.err.println("  -chuser 
USERNAME        Change the owner of the files " +<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>        "to the specified one.");<a 
name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    System.err.println("  -chgroup GROUP 
         Change the group of the files to " +<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        "the specified one.");<a 
name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    System.err.println("  -chmod MODE    
         Change the permission of the files " +<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>        "to the specified one.");<a 
name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    System.err.println("  -mappers       
         Number of mappers to use during the " +<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>        "copy (mapreduce.job.maps).");<a 
name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth     
         Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    System.err.println();<a 
name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a 
name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot 
export \\");<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    System.err.println("    -snapshot 
MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    System.err.println("    -chuser 
MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    System.err.println();<a 
name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot 
export \\");<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    System.err.println("    -snapshot 
MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    System.err.println("    -copy-to 
hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    System.exit(1);<a 
name="line.1067"></a>
-<span class="sourceLineNo">1068</span>  }<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>  /**<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>   * The guts of the {@link #main} 
method.<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>   * Call this method to avoid the 
{@link #main(String[])} System.exit.<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>   * @param args<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>   * @return errCode<a 
name="line.1074"></a>
-<span class="sourceLineNo">1075</span>   * @throws Exception<a 
name="line.1075"></a>
-<span class="sourceLineNo">1076</span>   */<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>  static int innerMain(final 
Configuration conf, final String [] args) throws Exception {<a 
name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    return ToolRunner.run(conf, new 
ExportSnapshot(), args);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>  }<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span><a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>  public static void main(String[] args) 
throws Exception {<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    
System.exit(innerMain(HBaseConfiguration.create(), args));<a 
name="line.1082"></a>
-<span class="sourceLineNo">1083</span>  }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>}<a name="line.1084"></a>
+<span class="sourceLineNo">942</span>    // Find the necessary directory which 
need to change owner and group<a name="line.942"></a>
+<span class="sourceLineNo">943</span>    Path needSetOwnerDir = 
SnapshotDescriptionUtils.getSnapshotRootDir(outputRoot);<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    if (outputFs.exists(needSetOwnerDir)) 
{<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      if (skipTmp) {<a 
name="line.945"></a>
+<span class="sourceLineNo">946</span>        needSetOwnerDir = 
outputSnapshotDir;<a name="line.946"></a>
+<span class="sourceLineNo">947</span>      } else {<a name="line.947"></a>
+<span class="sourceLineNo">948</span>        needSetOwnerDir = 
SnapshotDescriptionUtils.getWorkingSnapshotDir(outputRoot);<a 
name="line.948"></a>
+<span class="sourceLineNo">949</span>        if 
(outputFs.exists(needSetOwnerDir)) {<a name="line.949"></a>
+<span class="sourceLineNo">950</span>          needSetOwnerDir = 
snapshotTmpDir;<a name="line.950"></a>
+<span class="sourceLineNo">951</span>        }<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      }<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    }<a name="line.953"></a>
+<span class="sourceLineNo">954</span><a name="line.954"></a>
+<span class="sourceLineNo">955</span>    // Check if the snapshot already 
exists<a name="line.955"></a>
+<span class="sourceLineNo">956</span>    if 
(outputFs.exists(outputSnapshotDir)) {<a name="line.956"></a>
+<span class="sourceLineNo">957</span>      if (overwrite) {<a 
name="line.957"></a>
+<span class="sourceLineNo">958</span>        if 
(!outputFs.delete(outputSnapshotDir, true)) {<a name="line.958"></a>
+<span class="sourceLineNo">959</span>          System.err.println("Unable to 
remove existing snapshot directory: " + outputSnapshotDir);<a 
name="line.959"></a>
+<span class="sourceLineNo">960</span>          return 1;<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        }<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      } else {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>        System.err.println("The snapshot 
'" + targetName +<a name="line.963"></a>
+<span class="sourceLineNo">964</span>          "' already exists in the 
destination: " + outputSnapshotDir);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>        return 1;<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      }<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span><a name="line.968"></a>
+<span class="sourceLineNo">969</span>    if (!skipTmp) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      // Check if the snapshot already 
in-progress<a name="line.970"></a>
+<span class="sourceLineNo">971</span>      if 
(outputFs.exists(snapshotTmpDir)) {<a name="line.971"></a>
+<span class="sourceLineNo">972</span>        if (overwrite) {<a 
name="line.972"></a>
+<span class="sourceLineNo">973</span>          if 
(!outputFs.delete(snapshotTmpDir, true)) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>            System.err.println("Unable to 
remove existing snapshot tmp directory: "+snapshotTmpDir);<a 
name="line.974"></a>
+<span class="sourceLineNo">975</span>            return 1;<a 
name="line.975"></a>
+<span class="sourceLineNo">976</span>          }<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        } else {<a name="line.977"></a>
+<span class="sourceLineNo">978</span>          System.err.println("A snapshot 
with the same name '"+ targetName +"' may be in-progress");<a 
name="line.978"></a>
+<span class="sourceLineNo">979</span>          System.err.println("Please 
check "+snapshotTmpDir+". If the snapshot has completed, ");<a 
name="line.979"></a>
+<span class="sourceLineNo">980</span>          System.err.println("consider 
removing "+snapshotTmpDir+" by using the -overwrite option");<a 
name="line.980"></a>
+<span class="sourceLineNo">981</span>          return 1;<a name="line.981"></a>
+<span class="sourceLineNo">982</span>        }<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      }<a name="line.983"></a>
+<span class="sourceLineNo">984</span>    }<a name="line.984"></a>
+<span class="sourceLineNo">985</span><a name="line.985"></a>
+<span class="sourceLineNo">986</span>    // Step 1 - Copy 
fs1:/.snapshot/&lt;snapshot&gt; to  fs2:/.snapshot/.tmp/&lt;snapshot&gt;<a 
name="line.986"></a>
+<span class="sourceLineNo">987</span>    // The snapshot references must be 
copied before the hfiles otherwise the cleaner<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    // will remove them because they are 
unreferenced.<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    try {<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      LOG.info("Copy Snapshot 
Manifest");<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      FileUtil.copy(inputFs, snapshotDir, 
outputFs, initialOutputSnapshotDir, false, false, conf);<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    } catch (IOException e) {<a 
name="line.992"></a>
+<span class="sourceLineNo">993</span>      throw new 
ExportSnapshotException("Failed to copy the snapshot directory: from=" +<a 
name="line.993"></a>
+<span class="sourceLineNo">994</span>        snapshotDir + " to=" + 
initialOutputSnapshotDir, e);<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    } finally {<a name="line.995"></a>
+<span class="sourceLineNo">996</span>      if (filesUser != null || filesGroup 
!= null) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        LOG.warn((filesUser == null ? "" 
: "Change the owner of " + needSetOwnerDir + " to "<a name="line.997"></a>
+<span class="sourceLineNo">998</span>            + filesUser)<a 
name="line.998"></a>
+<span class="sourceLineNo">999</span>            + (filesGroup == null ? "" : 
", Change the group of " + needSetOwnerDir + " to "<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>            + filesGroup));<a 
name="line.1000"></a>
+<span class="sourceLineNo">1001</span>        setOwner(outputFs, 
needSetOwnerDir, filesUser, filesGroup, true);<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>      }<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>      if (filesMode &gt; 0) {<a 
name="line.1003"></a>
+<span class="sourceLineNo">1004</span>        LOG.warn("Change the permission 
of " + needSetOwnerDir + " to " + filesMode);<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>        setPermission(outputFs, 
needSetOwnerDir, (short)filesMode, true);<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>      }<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>    }<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span><a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    // Write a new .snapshotinfo if the 
target name is different from the source name<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    if 
(!targetName.equals(snapshotName)) {<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      SnapshotDescription snapshotDesc 
=<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>        
SnapshotDescriptionUtils.readSnapshotInfo(inputFs, snapshotDir)<a 
name="line.1012"></a>
+<span class="sourceLineNo">1013</span>          .toBuilder()<a 
name="line.1013"></a>
+<span class="sourceLineNo">1014</span>          .setName(targetName)<a 
name="line.1014"></a>
+<span class="sourceLineNo">1015</span>          .build();<a 
name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      
SnapshotDescriptionUtils.writeSnapshotInfo(snapshotDesc, snapshotTmpDir, 
outputFs);<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    }<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span><a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    // Step 2 - Start MR Job to copy 
files<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>    // The snapshot references must be 
copied before the files otherwise the files gets removed<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>    // by the HFileArchiver, since they 
have no references.<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    try {<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      runCopyJob(inputRoot, outputRoot, 
snapshotName, snapshotDir, verifyChecksum,<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>                 filesUser, filesGroup, 
filesMode, mappers, bandwidthMB);<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      LOG.info("Finalize the Snapshot 
Export");<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>      if (!skipTmp) {<a 
name="line.1027"></a>
+<span class="sourceLineNo">1028</span>        // Step 3 - Rename 
fs2:/.snapshot/.tmp/&lt;snapshot&gt; fs2:/.snapshot/&lt;snapshot&gt;<a 
name="line.1028"></a>
+<span class="sourceLineNo">1029</span>        if 
(!outputFs.rename(snapshotTmpDir, outputSnapshotDir)) {<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          throw new 
ExportSnapshotException("Unable to rename snapshot directory from=" +<a 
name="line.1030"></a>
+<span class="sourceLineNo">1031</span>            snapshotTmpDir + " to=" + 
outputSnapshotDir);<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>        }<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>      }<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span><a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>      // Step 4 - Verify snapshot 
integrity<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>      if (verifyTarget) {<a 
name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        LOG.info("Verify snapshot 
integrity");<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        verifySnapshot(destConf, 
outputFs, outputRoot, outputSnapshotDir);<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>      LOG.info("Export Completed: " + 
targetName);<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>      return 0;<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    } catch (Exception e) {<a 
name="line.1043"></a>
+<span class="sourceLineNo">1044</span>      LOG.error("Snapshot export 
failed", e);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>      if (!skipTmp) {<a 
name="line.1045"></a>
+<span class="sourceLineNo">1046</span>        outputFs.delete(snapshotTmpDir, 
true);<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>      }<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>      outputFs.delete(outputSnapshotDir, 
true);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>      return 1;<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    } finally {<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>      IOUtils.closeStream(inputFs);<a 
name="line.1051"></a>
+<span class="sourceLineNo">1052</span>      IOUtils.closeStream(outputFs);<a 
name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    }<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  }<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span><a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>  // ExportSnapshot<a 
name="line.1056"></a>
+<span class="sourceLineNo">1057</span>  private void printUsageAndExit() {<a 
name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    System.err.printf("Usage: bin/hbase 
%s [options]%n", getClass().getName());<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    System.err.println(" where [options] 
are:");<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  -h|-help       
         Show this help and exit.");<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    System.err.println("  -snapshot NAME 
         Snapshot to restore.");<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    System.err.println("  -copy-to NAME  
         Remote destination hdfs://");<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    System.err.println("  -copy-from 
NAME         Input folder hdfs:// (default hbase.rootdir)");<a 
name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  
-no-checksum-verify     Do not verify checksum, use name+length only.");<a 
name="line.1064"></a>
+<span class="sourceLineNo">1065</span>    System.err.println("  
-no-target-verify       Do not verify the integrity of the \\" +<a 
name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        "exported snapshot.");<a 
name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    System.err.println("  -overwrite     
         Rewrite the snapshot manifest if already exists");<a 
name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    System.err.println("  -chuser 
USERNAME        Change the owner of the files " +<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        "to the specified one.");<a 
name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    System.err.println("  -chgroup GROUP 
         Change the group of the files to " +<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        "the specified one.");<a 
name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    System.err.println("  -chmod MODE    
         Change the permission of the files " +<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        "to the specified one.");<a 
name="line.1073"></a>
+<span class="sourceLineNo">1074</span>    System.err.println("  -mappers       
         Number of mappers to use during the " +<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        "copy (mapreduce.job.maps).");<a 
name="line.1075"></a>
+<span class="sourceLineNo">1076</span>    System.err.println("  -bandwidth     
         Limit bandwidth to this value in MB/second.");<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>    System.err.println();<a 
name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    System.err.println("Examples:");<a 
name="line.1078"></a>
+<span class="sourceLineNo">1079</span>    System.err.println("  hbase snapshot 
export \\");<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>    System.err.println("    -snapshot 
MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    System.err.println("    -chuser 
MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    System.err.println();<a 
name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    System.err.println("  hbase snapshot 
export \\");<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    System.err.println("    -snapshot 
MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    System.err.println("    -copy-to 
hdfs://srv1:50070/hbase \\");<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    System.exit(1);<a 
name="line.1086"></a>
+<span class="sourceLineNo">1087</span>  }<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span><a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>  /**<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>   * The guts of the {@link #main} 
method.<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>   * Call this method to avoid the 
{@link #main(String[])} System.exit.<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>   * @param args<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>   * @return errCode<a 
name="line.1093"></a>
+<span class="sourceLineNo">1094</span>   * @throws Exception<a 
name="line.1094"></a>
+<span class="sourceLineNo">1095</span>   */<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>  static int innerMain(final 
Configuration conf, final String [] args) throws Exception {<a 
name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    return ToolRunner.run(conf, new 
ExportSnapshot(), args);<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>  }<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span><a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>  public static void main(String[] args) 
throws Exception {<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    
System.exit(innerMain(HBaseConfiguration.create(), args));<a 
name="line.1101"></a>
+<span class="sourceLineNo">1102</span>  }<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>}<a name="line.1103"></a>
 
 
 

Reply via email to