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/10/11 14:52:55 UTC

[01/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 76087e738 -> 6b0020b16


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html
index 080823f..1b350c9 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html
@@ -35,265 +35,268 @@
 <span class="sourceLineNo">027</span>import java.util.Collection;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Collections;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileSystem;<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.HConstants;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>// imports for things that haven't moved from regionserver.wal yet.<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * A WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * interactions with HDFS.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * &lt;p&gt;<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * separated list of allowed operations:<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;ul&gt;<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * filesystem.&lt;/li&gt;<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * &lt;/ul&gt;<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * also undefined if values not listed above are included.<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * no-ops.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;p&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> */<a name="line.69"></a>
-<span class="sourceLineNo">070</span>@InterfaceAudience.Private<a name="line.70"></a>
-<span class="sourceLineNo">071</span>public class IOTestProvider implements WALProvider {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private enum AllowedOperations {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    all,<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    append,<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    sync,<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    fileroll,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    none<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>  private WALFactory factory;<a name="line.83"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.Path;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HConstants;<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>// imports for things that haven't moved from regionserver.wal yet.<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.slf4j.Logger;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.slf4j.LoggerFactory;<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 WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * interactions with HDFS.<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * &lt;p&gt;<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * separated list of allowed operations:<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * &lt;ul&gt;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * filesystem.&lt;/li&gt;<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;/ul&gt;<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * also undefined if values not listed above are included.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;p&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * no-ops.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<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 class IOTestProvider implements WALProvider {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private enum AllowedOperations {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    all,<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    append,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    sync,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    fileroll,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    none<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
 <span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private Configuration conf;<a name="line.85"></a>
+<span class="sourceLineNo">085</span>  private WALFactory factory;<a name="line.85"></a>
 <span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private volatile FSHLog log;<a name="line.87"></a>
+<span class="sourceLineNo">087</span>  private Configuration conf;<a name="line.87"></a>
 <span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private String providerId;<a name="line.89"></a>
+<span class="sourceLineNo">089</span>  private volatile FSHLog log;<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @param conf may not be null<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   *                   null<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @Override<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    if (factory != null) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    this.factory = factory;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this.conf = conf;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public List&lt;WAL&gt; getWALs() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    return Collections.singletonList(log);<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>  private FSHLog createWAL() throws IOException {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<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>  @Override<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FSHLog log = this.log;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (log != null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return log;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    synchronized (this) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      log = this.log;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      if (log == null) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        log = createWAL();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        this.log = log;<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>    return log;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public void close() throws IOException {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    FSHLog log = this.log;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    if (log != null) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      log.close();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public void shutdown() throws IOException {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    FSHLog log = this.log;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (log != null) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      log.shutdown();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static class IOTestWAL extends FSHLog {<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final boolean doFileRolls;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    private final boolean initialized;<a name="line.158"></a>
+<span class="sourceLineNo">091</span>  private String providerId;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  protected AtomicBoolean initialized = new AtomicBoolean(false);<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * @param conf may not be null<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   *                   null<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    if (!initialized.compareAndSet(false, true)) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    this.factory = factory;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    this.conf = conf;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<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>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public List&lt;WAL&gt; getWALs() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return Collections.singletonList(log);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private FSHLog createWAL() throws IOException {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @Override<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    FSHLog log = this.log;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (log != null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      return log;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    synchronized (this) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      log = this.log;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (log == null) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        log = createWAL();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        this.log = log;<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>    return log;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public void close() throws IOException {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    FSHLog log = this.log;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (log != null) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      log.close();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public void shutdown() throws IOException {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    FSHLog log = this.log;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (log != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      log.shutdown();<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>  private static class IOTestWAL extends FSHLog {<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    private final boolean doFileRolls;<a name="line.158"></a>
 <span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>     *<a name="line.162"></a>
-<span class="sourceLineNo">163</span>     * You should never have to load an existing log. If there is a log at<a name="line.163"></a>
-<span class="sourceLineNo">164</span>     * startup, it should have already been processed and deleted by the time the<a name="line.164"></a>
-<span class="sourceLineNo">165</span>     * WAL object is started up.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>     *<a name="line.166"></a>
-<span class="sourceLineNo">167</span>     * @param fs filesystem handle<a name="line.167"></a>
-<span class="sourceLineNo">168</span>     * @param rootDir path to where logs and oldlogs<a name="line.168"></a>
-<span class="sourceLineNo">169</span>     * @param logDir dir where wals are stored<a name="line.169"></a>
-<span class="sourceLineNo">170</span>     * @param archiveDir dir where wals are archived<a name="line.170"></a>
-<span class="sourceLineNo">171</span>     * @param conf configuration to use<a name="line.171"></a>
-<span class="sourceLineNo">172</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.172"></a>
-<span class="sourceLineNo">173</span>     * be registered before we do anything else; e.g. the<a name="line.173"></a>
-<span class="sourceLineNo">174</span>     * Constructor {@link #rollWriter()}.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.175"></a>
-<span class="sourceLineNo">176</span>     *        already exist.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.177"></a>
-<span class="sourceLineNo">178</span>     *        it will be URL encoded before being used.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>     *        If prefix is null, "wal" will be used<a name="line.179"></a>
-<span class="sourceLineNo">180</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.180"></a>
-<span class="sourceLineNo">181</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.181"></a>
-<span class="sourceLineNo">182</span>     * @throws IOException<a name="line.182"></a>
-<span class="sourceLineNo">183</span>     */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        final String archiveDir, final Configuration conf,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        throws IOException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.191"></a>
-<span class="sourceLineNo">192</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      initialized = true;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<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>    private Writer noRollsWriter;<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // if we are skipping it, just keep returning the same writer.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    @Override<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // we don't know yet if we're supposed to generally roll and<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (!initialized || doFileRolls) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.info("creating new writer instance.");<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        try {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>              "doesn't support needed stream capabilities.", exception);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        if (!initialized) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>          noRollsWriter = writer;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        return writer;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      } else {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        // a race for first assignment.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        return noRollsWriter;<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    private boolean doAppends;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    private boolean doSyncs;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>    @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        doAppends = doSyncs = true;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        doAppends = doSyncs = false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      } else {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected String getWriterClassName() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return ProtobufLogWriter.class.getSimpleName();<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>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public void append(Entry entry) throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (doAppends) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        super.append(entry);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    @Override<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    public void sync(boolean forceSync) throws IOException {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (doSyncs) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        super.sync(forceSync);<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><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getNumLogFiles() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.log.getNumLogFiles();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public long getLogFileSize() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // TODO Implement WALProvider.addWALActionLister<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>}<a name="line.288"></a>
+<span class="sourceLineNo">160</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    private final boolean initialized;<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>     *<a name="line.165"></a>
+<span class="sourceLineNo">166</span>     * You should never have to load an existing log. If there is a log at<a name="line.166"></a>
+<span class="sourceLineNo">167</span>     * startup, it should have already been processed and deleted by the time the<a name="line.167"></a>
+<span class="sourceLineNo">168</span>     * WAL object is started up.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>     *<a name="line.169"></a>
+<span class="sourceLineNo">170</span>     * @param fs filesystem handle<a name="line.170"></a>
+<span class="sourceLineNo">171</span>     * @param rootDir path to where logs and oldlogs<a name="line.171"></a>
+<span class="sourceLineNo">172</span>     * @param logDir dir where wals are stored<a name="line.172"></a>
+<span class="sourceLineNo">173</span>     * @param archiveDir dir where wals are archived<a name="line.173"></a>
+<span class="sourceLineNo">174</span>     * @param conf configuration to use<a name="line.174"></a>
+<span class="sourceLineNo">175</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.175"></a>
+<span class="sourceLineNo">176</span>     * be registered before we do anything else; e.g. the<a name="line.176"></a>
+<span class="sourceLineNo">177</span>     * Constructor {@link #rollWriter()}.<a name="line.177"></a>
+<span class="sourceLineNo">178</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.178"></a>
+<span class="sourceLineNo">179</span>     *        already exist.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.180"></a>
+<span class="sourceLineNo">181</span>     *        it will be URL encoded before being used.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>     *        If prefix is null, "wal" will be used<a name="line.182"></a>
+<span class="sourceLineNo">183</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.183"></a>
+<span class="sourceLineNo">184</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.184"></a>
+<span class="sourceLineNo">185</span>     * @throws IOException<a name="line.185"></a>
+<span class="sourceLineNo">186</span>     */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        final String archiveDir, final Configuration conf,<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        throws IOException {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      initialized = true;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>    private Writer noRollsWriter;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // if we are skipping it, just keep returning the same writer.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    @Override<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // we don't know yet if we're supposed to generally roll and<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      if (!initialized || doFileRolls) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        LOG.info("creating new writer instance.");<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        try {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.215"></a>
+<span class="sourceLineNo">216</span>              "doesn't support needed stream capabilities.", exception);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        if (!initialized) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          noRollsWriter = writer;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        return writer;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      } else {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        // a race for first assignment.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        return noRollsWriter;<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>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    private boolean doAppends;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    private boolean doSyncs;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        doAppends = doSyncs = true;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        doAppends = doSyncs = false;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      } else {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    protected String getWriterClassName() {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return ProtobufLogWriter.class.getSimpleName();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public void append(Entry entry) throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (doAppends) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        super.append(entry);<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>    @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public void sync(boolean forceSync) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (doSyncs) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        super.sync(forceSync);<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">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public long getNumLogFiles() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    return this.log.getNumLogFiles();<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>  @Override<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  public long getLogFileSize() {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // TODO Implement WALProvider.addWALActionLister<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
index 1d4126b..e25c0b8 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.DumbWALActionsListener.html
@@ -688,69 +688,96 @@
 <span class="sourceLineNo">680</span>  @Test<a name="line.680"></a>
 <span class="sourceLineNo">681</span>  public void testWALProviders() throws IOException {<a name="line.681"></a>
 <span class="sourceLineNo">682</span>    Configuration conf = new Configuration();<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    // if providers are not set but enable SyncReplicationWALProvider by default for master node<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    // with not only system tables<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .getWrappedProvider();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    assertEquals(wrappedWALProvider.getClass(), walFactory.getMetaProvider().getClass());<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // if providers are not set and do not enable SyncReplicationWALProvider<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    walFactory = new WALFactory(conf, this.currentServername.toString(), false);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    assertEquals(walFactory.getWALProvider().getClass(), walFactory.getMetaProvider().getClass());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  @Test<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public void testOnlySetWALProvider() throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    Configuration conf = new Configuration();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    conf.set(WAL_PROVIDER, WALFactory.Providers.multiwal.name());<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        .getWrappedProvider();<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // class of WALProvider and metaWALProvider are the same when metaWALProvider is not set<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    assertEquals(WALFactory.Providers.multiwal.clazz, wrappedWALProvider.getClass());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    assertEquals(WALFactory.Providers.multiwal.clazz, walFactory.getMetaProvider().getClass());<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  }<a name="line.708"></a>
-<span class="sourceLineNo">709</span><a name="line.709"></a>
-<span class="sourceLineNo">710</span>  @Test<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  public void testOnlySetMetaWALProvider() throws IOException {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    Configuration conf = new Configuration();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    conf.set(META_WAL_PROVIDER, WALFactory.Providers.asyncfs.name());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        .getWrappedProvider();<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    assertEquals(WALFactory.Providers.defaultProvider.clazz, wrappedWALProvider.getClass());<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    assertEquals(WALFactory.Providers.asyncfs.clazz, walFactory.getMetaProvider().getClass());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testDefaultProvider() throws IOException {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    final Configuration conf = new Configuration();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    // AsyncFSWal is the default, we should be able to request any WAL.<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory normalWalFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    Class&lt;? extends WALProvider&gt; fshLogProvider = normalWalFactory.getProviderClass(<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    assertEquals(Providers.filesystem.clazz, fshLogProvider);<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>    // Imagine a world where MultiWAL is the default<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final WALFactory customizedWalFactory = new WALFactory(<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        conf, this.currentServername.toString())  {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      @Override<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      Providers getDefaultProvider() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        return Providers.multiwal;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    };<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    // If we don't specify a WALProvider, we should get the default implementation.<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    Class&lt;? extends WALProvider&gt; multiwalProviderClass = customizedWalFactory.getProviderClass(<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        WALFactory.WAL_PROVIDER, Providers.multiwal.name());<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    assertEquals(Providers.multiwal.clazz, multiwalProviderClass);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>}<a name="line.745"></a>
+<span class="sourceLineNo">683</span>    conf.set(HConstants.HBASE_DIR, TestWALFactory.conf.get(HConstants.HBASE_DIR));<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    // if providers are not set but enable SyncReplicationWALProvider by default for master node<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    // with not only system tables<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        .getWrappedProvider();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    assertEquals(wrappedWALProvider.getClass(), walFactory.getMetaProvider().getClass());<a name="line.690"></a>
+<span class="sourceLineNo">691</span><a name="line.691"></a>
+<span class="sourceLineNo">692</span>    // if providers are not set and do not enable SyncReplicationWALProvider<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    walFactory = new WALFactory(conf, this.currentServername.toString(), false);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    assertEquals(walFactory.getWALProvider().getClass(), walFactory.getMetaProvider().getClass());<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>  @Test<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  public void testOnlySetWALProvider() throws IOException {<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    Configuration conf = new Configuration();<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    conf.set(WAL_PROVIDER, RegionGroupingProvider.class.getName());<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    conf.set(HConstants.HBASE_DIR, TestWALFactory.conf.get(HConstants.HBASE_DIR));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        .getWrappedProvider();<a name="line.704"></a>
+<span class="sourceLineNo">705</span><a name="line.705"></a>
+<span class="sourceLineNo">706</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    // class of WALProvider and metaWALProvider are the same when metaWALProvider is not set<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    assertEquals(RegionGroupingProvider.class, wrappedWALProvider.getClass());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    assertEquals(RegionGroupingProvider.class, walFactory.getMetaProvider().getClass());<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  }<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>  @Test<a name="line.712"></a>
+<span class="sourceLineNo">713</span>  public void testOnlySetMetaWALProvider() throws IOException {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    Configuration conf = new Configuration();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    conf.set(META_WAL_PROVIDER, AsyncFSWALProvider.class.getName());<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    conf.set(HConstants.HBASE_DIR, TestWALFactory.conf.get(HConstants.HBASE_DIR));<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        .getWrappedProvider();<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    assertEquals(AsyncFSWALProvider.class, wrappedWALProvider.getClass());<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    assertEquals(AsyncFSWALProvider.class, walFactory.getMetaProvider().getClass());<a name="line.723"></a>
+<span class="sourceLineNo">724</span>  }<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>  @Test<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  public void testDefaultProvider() throws IOException {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    final Configuration conf = new Configuration();<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // AsyncFSWal is the default, we should be able to request any WAL.<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    final WALFactory normalWalFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    Class&lt;? extends WALProvider&gt; fshLogProvider = normalWalFactory.getProviderClass(<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    assertEquals(Providers.filesystem.clazz, fshLogProvider);<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    // Imagine a world where MultiWAL is the default<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    final WALFactory customizedWalFactory = new WALFactory(<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        conf, this.currentServername.toString())  {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      @Override<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      Providers getDefaultProvider() {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>        return Providers.multiwal;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    };<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    // If we don't specify a WALProvider, we should get the default implementation.<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    Class&lt;? extends WALProvider&gt; multiwalProviderClass = customizedWalFactory.getProviderClass(<a name="line.744"></a>
+<span class="sourceLineNo">745</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.multiwal.name());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    assertEquals(Providers.multiwal.clazz, multiwalProviderClass);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>  @Test<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  public void testCustomProvider() throws IOException {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    final Configuration config = new Configuration();<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    config.set(WALFactory.WAL_PROVIDER_CLASS, IOTestProvider.class.getName());<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    final WALFactory walFactory = new WALFactory(config, this.currentServername.toString());<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    Class&lt;? extends WALProvider&gt; walProvider = walFactory.getProviderClass(<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    assertEquals(IOTestProvider.class, walProvider);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    WALProvider metaWALProvider = walFactory.getMetaProvider();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    assertEquals(IOTestProvider.class, metaWALProvider.getClass());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>  }<a name="line.759"></a>
+<span class="sourceLineNo">760</span><a name="line.760"></a>
+<span class="sourceLineNo">761</span>  @Test<a name="line.761"></a>
+<span class="sourceLineNo">762</span>  public void testCustomMetaProvider() throws IOException {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    final Configuration config = new Configuration();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    config.set(WALFactory.META_WAL_PROVIDER_CLASS, IOTestProvider.class.getName());<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    final WALFactory walFactory = new WALFactory(config, this.currentServername.toString());<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    Class&lt;? extends WALProvider&gt; walProvider = walFactory.getProviderClass(<a name="line.766"></a>
+<span class="sourceLineNo">767</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    assertEquals(Providers.filesystem.clazz, walProvider);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    WALProvider metaWALProvider = walFactory.getMetaProvider();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    assertEquals(IOTestProvider.class, metaWALProvider.getClass());<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>}<a name="line.772"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
index 1d4126b..e25c0b8 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html
@@ -688,69 +688,96 @@
 <span class="sourceLineNo">680</span>  @Test<a name="line.680"></a>
 <span class="sourceLineNo">681</span>  public void testWALProviders() throws IOException {<a name="line.681"></a>
 <span class="sourceLineNo">682</span>    Configuration conf = new Configuration();<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    // if providers are not set but enable SyncReplicationWALProvider by default for master node<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    // with not only system tables<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.687"></a>
-<span class="sourceLineNo">688</span>        .getWrappedProvider();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    assertEquals(wrappedWALProvider.getClass(), walFactory.getMetaProvider().getClass());<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // if providers are not set and do not enable SyncReplicationWALProvider<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    walFactory = new WALFactory(conf, this.currentServername.toString(), false);<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    assertEquals(walFactory.getWALProvider().getClass(), walFactory.getMetaProvider().getClass());<a name="line.693"></a>
-<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>  @Test<a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public void testOnlySetWALProvider() throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    Configuration conf = new Configuration();<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    conf.set(WAL_PROVIDER, WALFactory.Providers.multiwal.name());<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        .getWrappedProvider();<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // class of WALProvider and metaWALProvider are the same when metaWALProvider is not set<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    assertEquals(WALFactory.Providers.multiwal.clazz, wrappedWALProvider.getClass());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    assertEquals(WALFactory.Providers.multiwal.clazz, walFactory.getMetaProvider().getClass());<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  }<a name="line.708"></a>
-<span class="sourceLineNo">709</span><a name="line.709"></a>
-<span class="sourceLineNo">710</span>  @Test<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  public void testOnlySetMetaWALProvider() throws IOException {<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    Configuration conf = new Configuration();<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    conf.set(META_WAL_PROVIDER, WALFactory.Providers.asyncfs.name());<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        .getWrappedProvider();<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    assertEquals(WALFactory.Providers.defaultProvider.clazz, wrappedWALProvider.getClass());<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    assertEquals(WALFactory.Providers.asyncfs.clazz, walFactory.getMetaProvider().getClass());<a name="line.720"></a>
-<span class="sourceLineNo">721</span>  }<a name="line.721"></a>
-<span class="sourceLineNo">722</span><a name="line.722"></a>
-<span class="sourceLineNo">723</span>  @Test<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  public void testDefaultProvider() throws IOException {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    final Configuration conf = new Configuration();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    // AsyncFSWal is the default, we should be able to request any WAL.<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    final WALFactory normalWalFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    Class&lt;? extends WALProvider&gt; fshLogProvider = normalWalFactory.getProviderClass(<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    assertEquals(Providers.filesystem.clazz, fshLogProvider);<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>    // Imagine a world where MultiWAL is the default<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    final WALFactory customizedWalFactory = new WALFactory(<a name="line.733"></a>
-<span class="sourceLineNo">734</span>        conf, this.currentServername.toString())  {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      @Override<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      Providers getDefaultProvider() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>        return Providers.multiwal;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      }<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    };<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    // If we don't specify a WALProvider, we should get the default implementation.<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    Class&lt;? extends WALProvider&gt; multiwalProviderClass = customizedWalFactory.getProviderClass(<a name="line.741"></a>
-<span class="sourceLineNo">742</span>        WALFactory.WAL_PROVIDER, Providers.multiwal.name());<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    assertEquals(Providers.multiwal.clazz, multiwalProviderClass);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  }<a name="line.744"></a>
-<span class="sourceLineNo">745</span>}<a name="line.745"></a>
+<span class="sourceLineNo">683</span>    conf.set(HConstants.HBASE_DIR, TestWALFactory.conf.get(HConstants.HBASE_DIR));<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    // if providers are not set but enable SyncReplicationWALProvider by default for master node<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    // with not only system tables<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        .getWrappedProvider();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    assertEquals(wrappedWALProvider.getClass(), walFactory.getMetaProvider().getClass());<a name="line.690"></a>
+<span class="sourceLineNo">691</span><a name="line.691"></a>
+<span class="sourceLineNo">692</span>    // if providers are not set and do not enable SyncReplicationWALProvider<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    walFactory = new WALFactory(conf, this.currentServername.toString(), false);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    assertEquals(walFactory.getWALProvider().getClass(), walFactory.getMetaProvider().getClass());<a name="line.694"></a>
+<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>  @Test<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  public void testOnlySetWALProvider() throws IOException {<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    Configuration conf = new Configuration();<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    conf.set(WAL_PROVIDER, RegionGroupingProvider.class.getName());<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    conf.set(HConstants.HBASE_DIR, TestWALFactory.conf.get(HConstants.HBASE_DIR));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.703"></a>
+<span class="sourceLineNo">704</span>        .getWrappedProvider();<a name="line.704"></a>
+<span class="sourceLineNo">705</span><a name="line.705"></a>
+<span class="sourceLineNo">706</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    // class of WALProvider and metaWALProvider are the same when metaWALProvider is not set<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    assertEquals(RegionGroupingProvider.class, wrappedWALProvider.getClass());<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    assertEquals(RegionGroupingProvider.class, walFactory.getMetaProvider().getClass());<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  }<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>  @Test<a name="line.712"></a>
+<span class="sourceLineNo">713</span>  public void testOnlySetMetaWALProvider() throws IOException {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    Configuration conf = new Configuration();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    conf.set(META_WAL_PROVIDER, AsyncFSWALProvider.class.getName());<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    conf.set(HConstants.HBASE_DIR, TestWALFactory.conf.get(HConstants.HBASE_DIR));<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    WALFactory walFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    WALProvider wrappedWALProvider = ((SyncReplicationWALProvider) walFactory.getWALProvider())<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        .getWrappedProvider();<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>    assertEquals(SyncReplicationWALProvider.class, walFactory.getWALProvider().getClass());<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    assertEquals(AsyncFSWALProvider.class, wrappedWALProvider.getClass());<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    assertEquals(AsyncFSWALProvider.class, walFactory.getMetaProvider().getClass());<a name="line.723"></a>
+<span class="sourceLineNo">724</span>  }<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>  @Test<a name="line.726"></a>
+<span class="sourceLineNo">727</span>  public void testDefaultProvider() throws IOException {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    final Configuration conf = new Configuration();<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // AsyncFSWal is the default, we should be able to request any WAL.<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    final WALFactory normalWalFactory = new WALFactory(conf, this.currentServername.toString());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    Class&lt;? extends WALProvider&gt; fshLogProvider = normalWalFactory.getProviderClass(<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    assertEquals(Providers.filesystem.clazz, fshLogProvider);<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>    // Imagine a world where MultiWAL is the default<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    final WALFactory customizedWalFactory = new WALFactory(<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        conf, this.currentServername.toString())  {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      @Override<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      Providers getDefaultProvider() {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>        return Providers.multiwal;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    };<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    // If we don't specify a WALProvider, we should get the default implementation.<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    Class&lt;? extends WALProvider&gt; multiwalProviderClass = customizedWalFactory.getProviderClass(<a name="line.744"></a>
+<span class="sourceLineNo">745</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.multiwal.name());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    assertEquals(Providers.multiwal.clazz, multiwalProviderClass);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>  @Test<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  public void testCustomProvider() throws IOException {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    final Configuration config = new Configuration();<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    config.set(WALFactory.WAL_PROVIDER_CLASS, IOTestProvider.class.getName());<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    final WALFactory walFactory = new WALFactory(config, this.currentServername.toString());<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    Class&lt;? extends WALProvider&gt; walProvider = walFactory.getProviderClass(<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    assertEquals(IOTestProvider.class, walProvider);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    WALProvider metaWALProvider = walFactory.getMetaProvider();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    assertEquals(IOTestProvider.class, metaWALProvider.getClass());<a name="line.758"></a>
+<span class="sourceLineNo">759</span>  }<a name="line.759"></a>
+<span class="sourceLineNo">760</span><a name="line.760"></a>
+<span class="sourceLineNo">761</span>  @Test<a name="line.761"></a>
+<span class="sourceLineNo">762</span>  public void testCustomMetaProvider() throws IOException {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    final Configuration config = new Configuration();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    config.set(WALFactory.META_WAL_PROVIDER_CLASS, IOTestProvider.class.getName());<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    final WALFactory walFactory = new WALFactory(config, this.currentServername.toString());<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    Class&lt;? extends WALProvider&gt; walProvider = walFactory.getProviderClass(<a name="line.766"></a>
+<span class="sourceLineNo">767</span>        WALFactory.WAL_PROVIDER_CLASS, WALFactory.WAL_PROVIDER, Providers.filesystem.name());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    assertEquals(Providers.filesystem.clazz, walProvider);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    WALProvider metaWALProvider = walFactory.getMetaProvider();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    assertEquals(IOTestProvider.class, metaWALProvider.getClass());<a name="line.770"></a>
+<span class="sourceLineNo">771</span>  }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>}<a name="line.772"></a>
 
 
 


[10/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
index 288bb00..7114b2c 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.252">RegionGroupingProvider.IdentityGroupingStrategy</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.255">RegionGroupingProvider.IdentityGroupingStrategy</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a></pre>
 </li>
@@ -210,7 +210,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingPro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IdentityGroupingStrategy</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.252">IdentityGroupingStrategy</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.255">IdentityGroupingStrategy</a>()</pre>
 </li>
 </ul>
 </li>
@@ -227,7 +227,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingPro
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.254">init</a>(org.apache.hadoop.conf.Configuration&nbsp;config,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.257">init</a>(org.apache.hadoop.conf.Configuration&nbsp;config,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;providerId)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -241,7 +241,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingPro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>group</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.256">group</a>(byte[]&nbsp;identifier,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.259">group</a>(byte[]&nbsp;identifier,
                     byte[]&nbsp;namespace)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html#group-byte:A-byte:A-">RegionGroupingProvider.RegionGroupingStrategy</a></code></span></div>
 <div class="block">Given an identifier and a namespace, pick a group.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
index 8487361..dbd06e5 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
@@ -216,34 +216,38 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.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/wal/RegionGroupingProvider.html#DELEGATE_PROVIDER_CLASS">DELEGATE_PROVIDER_CLASS</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#factory">factory</a></span></code>&nbsp;</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/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#listeners">listeners</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#LOG">LOG</a></span></code>&nbsp;</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/wal/RegionGroupingProvider.html#META_WAL_GROUP_NAME">META_WAL_GROUP_NAME</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#providerClass">providerClass</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="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/wal/RegionGroupingProvider.html#providerId">providerId</a></span></code>&nbsp;</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/wal/RegionGroupingProvider.html#REGION_GROUPING_STRATEGY">REGION_GROUPING_STRATEGY</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#strategy">strategy</a></span></code>&nbsp;</td>
 </tr>
@@ -415,13 +419,26 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 </dl>
 </li>
 </ul>
+<a name="DELEGATE_PROVIDER_CLASS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>DELEGATE_PROVIDER_CLASS</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.124">DELEGATE_PROVIDER_CLASS</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.RegionGroupingProvider.DELEGATE_PROVIDER_CLASS">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
 <a name="DEFAULT_DELEGATE_PROVIDER">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_DELEGATE_PROVIDER</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.124">DEFAULT_DELEGATE_PROVIDER</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.126">DEFAULT_DELEGATE_PROVIDER</a></pre>
 </li>
 </ul>
 <a name="META_WAL_GROUP_NAME">
@@ -430,7 +447,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>META_WAL_GROUP_NAME</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.127">META_WAL_GROUP_NAME</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.129">META_WAL_GROUP_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.RegionGroupingProvider.META_WAL_GROUP_NAME">Constant Field Values</a></dd>
@@ -443,7 +460,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>cached</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.130">cached</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.132">cached</a></pre>
 <div class="block">A group-provider mapping, make sure one-one rather than many-one mapping</div>
 </li>
 </ul>
@@ -453,7 +470,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createLock</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.132">createLock</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.134">createLock</a></pre>
 </li>
 </ul>
 <a name="strategy">
@@ -462,7 +479,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>strategy</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.134">strategy</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.136">strategy</a></pre>
 </li>
 </ul>
 <a name="factory">
@@ -471,7 +488,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>factory</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.135">factory</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.137">factory</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -480,7 +497,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.136">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.138">conf</a></pre>
 </li>
 </ul>
 <a name="listeners">
@@ -489,7 +506,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>listeners</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.137">listeners</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.139">listeners</a></pre>
 </li>
 </ul>
 <a name="providerId">
@@ -498,7 +515,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>providerId</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.138">providerId</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.140">providerId</a></pre>
 </li>
 </ul>
 <a name="providerClass">
@@ -507,7 +524,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>providerClass</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.139">providerClass</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.141">providerClass</a></pre>
 </li>
 </ul>
 </li>
@@ -559,7 +576,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.142">init</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;factory,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.144">init</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;factory,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;providerId)
           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>
@@ -583,7 +600,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createProvider</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.161">createProvider</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;group)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.164">createProvider</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;group)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -597,7 +614,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.170">getWALs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.173">getWALs</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#getWALs--">getWALs</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a></code></dd>
@@ -612,7 +629,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.174">getWAL</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;group)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.177">getWAL</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;group)
             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>
@@ -626,7 +643,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.193">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.196">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -646,7 +663,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.213">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.216">shutdown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#shutdown--">WALProvider</a></code></span></div>
 <div class="block">persist outstanding WALs to storage and stop accepting new appends. This method serves as
@@ -666,7 +683,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.233">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.236">close</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#close--">WALProvider</a></code></span></div>
 <div class="block">shutdown utstanding WALs and clean up any persisted state. Call this method only when you will
@@ -686,7 +703,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumLogFiles</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.262">getNumLogFiles</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.265">getNumLogFiles</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#getNumLogFiles--">WALProvider</a></code></span></div>
 <div class="block">Get number of the log files this provider is managing</div>
 <dl>
@@ -701,7 +718,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.271">getLogFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.274">getLogFileSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#getLogFileSize--">WALProvider</a></code></span></div>
 <div class="block">Get size of the log files this provider is managing</div>
 <dl>
@@ -716,7 +733,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>addWALActionsListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.280">addWALActionsListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.283">addWALActionsListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#addWALActionsListener-org.apache.hadoop.hbase.regionserver.wal.WALActionsListener-">WALProvider</a></code></span></div>
 <div class="block">Add a <a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal"><code>WALActionsListener</code></a>.
  <p>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
index df7002f..46f12cf 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
@@ -178,23 +178,31 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER">DEFAULT_WAL_PROVIDER</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>(package private) static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER_CLASS">DEFAULT_WAL_PROVIDER_CLASS</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="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/wal/WALFactory.html#factoryId">factoryId</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/AbstractFSWALProvider.Reader.html" title="interface in org.apache.hadoop.hbase.wal">AbstractFSWALProvider.Reader</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#logReaderClass">logReaderClass</a></span></code>
 <div class="block">Configuration-specified WAL Reader used when a custom reader is requested</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/wal/WALFactory.html#META_WAL_PROVIDER">META_WAL_PROVIDER</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#META_WAL_PROVIDER_CLASS">META_WAL_PROVIDER_CLASS</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#metaProvider">metaProvider</a></span></code>&nbsp;</td>
@@ -221,6 +229,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <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/wal/WALFactory.html#WAL_PROVIDER">WAL_PROVIDER</a></span></code>&nbsp;</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/wal/WALFactory.html#WAL_PROVIDER_CLASS">WAL_PROVIDER_CLASS</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -369,7 +381,8 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clsKey,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;defaultValue)</code>&nbsp;</td>
 </tr>
 <tr id="i17" class="rowColor">
@@ -443,26 +456,61 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.82">DEFAULT_WAL_PROVIDER</a></pre>
 </li>
 </ul>
+<a name="WAL_PROVIDER_CLASS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>WAL_PROVIDER_CLASS</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.83">WAL_PROVIDER_CLASS</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.WALFactory.WAL_PROVIDER_CLASS">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="DEFAULT_WAL_PROVIDER_CLASS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>DEFAULT_WAL_PROVIDER_CLASS</h4>
+<pre>static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.84">DEFAULT_WAL_PROVIDER_CLASS</a></pre>
+</li>
+</ul>
 <a name="META_WAL_PROVIDER">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>META_WAL_PROVIDER</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.84">META_WAL_PROVIDER</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.86">META_WAL_PROVIDER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.WALFactory.META_WAL_PROVIDER">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
+<a name="META_WAL_PROVIDER_CLASS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>META_WAL_PROVIDER_CLASS</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.87">META_WAL_PROVIDER_CLASS</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.WALFactory.META_WAL_PROVIDER_CLASS">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
 <a name="factoryId">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>factoryId</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.86">factoryId</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.89">factoryId</a></pre>
 </li>
 </ul>
 <a name="provider">
@@ -471,7 +519,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>provider</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.87">provider</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.90">provider</a></pre>
 </li>
 </ul>
 <a name="metaProvider">
@@ -480,7 +528,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>metaProvider</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.91">metaProvider</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.94">metaProvider</a></pre>
 </li>
 </ul>
 <a name="logReaderClass">
@@ -489,7 +537,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>logReaderClass</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/AbstractFSWALProvider.Reader.html" title="interface in org.apache.hadoop.hbase.wal">AbstractFSWALProvider.Reader</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.96">logReaderClass</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/AbstractFSWALProvider.Reader.html" title="interface in org.apache.hadoop.hbase.wal">AbstractFSWALProvider.Reader</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.99">logReaderClass</a></pre>
 <div class="block">Configuration-specified WAL Reader used when a custom reader is requested</div>
 </li>
 </ul>
@@ -499,7 +547,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>timeoutMillis</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.101">timeoutMillis</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.104">timeoutMillis</a></pre>
 <div class="block">How long to attempt opening in-recovery wals</div>
 </li>
 </ul>
@@ -509,7 +557,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.103">conf</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.106">conf</a></pre>
 </li>
 </ul>
 <a name="singleton">
@@ -518,7 +566,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>singleton</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.396">singleton</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.420">singleton</a></pre>
 </li>
 </ul>
 <a name="SINGLETON_ID">
@@ -527,7 +575,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SINGLETON_ID</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.397">SINGLETON_ID</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.421">SINGLETON_ID</a></pre>
 </li>
 </ul>
 </li>
@@ -544,7 +592,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.106">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.109">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="WALFactory-org.apache.hadoop.conf.Configuration-java.lang.String-">
@@ -553,7 +601,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.173">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.194">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;factoryId)
            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>
@@ -573,7 +621,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.187">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.208">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;factoryId,
                   boolean&nbsp;enableSyncReplicationWALProvider)
            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>
@@ -604,16 +652,17 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultProvider</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.123">getDefaultProvider</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.126">getDefaultProvider</a>()</pre>
 </li>
 </ul>
-<a name="getProviderClass-java.lang.String-java.lang.String-">
+<a name="getProviderClass-java.lang.String-java.lang.String-java.lang.String-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getProviderClass</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.128">getProviderClass</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.137">getProviderClass</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clsKey,
+                                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;defaultValue)</pre>
 </li>
 </ul>
@@ -623,7 +672,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createProvider</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.156">createProvider</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;clazz)
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.177">createProvider</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;clazz)
                            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>
@@ -637,7 +686,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.219">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.241">close</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">Shutdown all WALs and clean up any underlying storage.
  Use only when you will not need to replay and edits that have gone to any wals from this
@@ -654,7 +703,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.236">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.258">shutdown</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">Tell the underlying WAL providers to shut down, but do not clean up underlying storage.
  If you are not ending cleanly and will need to replay edits from this factory's wals,
@@ -671,7 +720,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.252">getWALs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.274">getWALs</a>()</pre>
 </li>
 </ul>
 <a name="getMetaProvider--">
@@ -680,7 +729,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaProvider</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.257">getMetaProvider</a>()
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.279">getMetaProvider</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>
@@ -694,7 +743,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.279">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.303">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -710,7 +759,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.289">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.313">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path)
                         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>
@@ -725,7 +774,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.300">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.324">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                         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>
@@ -746,7 +795,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.305">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.329">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter,
                                boolean&nbsp;allowCustom)
@@ -763,7 +812,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALWriter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.377">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.401">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                           org.apache.hadoop.fs.Path&nbsp;path)
                                    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 a writer for the WAL.
@@ -785,7 +834,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRecoveredEditsWriter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.387">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.411">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                      org.apache.hadoop.fs.Path&nbsp;path)
                                               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">Should be package-private, visible for recovery testing.
@@ -804,7 +853,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getInstance</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.400">getInstance</a>(org.apache.hadoop.conf.Configuration&nbsp;configuration)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.424">getInstance</a>(org.apache.hadoop.conf.Configuration&nbsp;configuration)</pre>
 </li>
 </ul>
 <a name="createReader-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">
@@ -813,7 +862,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.424">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.448">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                       org.apache.hadoop.fs.Path&nbsp;path,
                                       org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                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>
@@ -833,7 +882,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.434">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.458">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                org.apache.hadoop.conf.Configuration&nbsp;configuration,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
@@ -854,7 +903,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReaderIgnoreCustomClass</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.445">createReaderIgnoreCustomClass</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.469">createReaderIgnoreCustomClass</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                        org.apache.hadoop.fs.Path&nbsp;path,
                                                        org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                                 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>
@@ -875,7 +924,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRecoveredEditsWriter</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.455">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.479">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                      org.apache.hadoop.fs.Path&nbsp;path,
                                                      org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                               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,7 +944,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALWriter</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.467">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.491">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                  org.apache.hadoop.fs.Path&nbsp;path,
                                                  org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                           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>
@@ -915,7 +964,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALProvider</h4>
-<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.473">getWALProvider</a>()</pre>
+<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.497">getWALProvider</a>()</pre>
 </li>
 </ul>
 <a name="getMetaWALProvider--">
@@ -924,7 +973,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMetaWALProvider</h4>
-<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.477">getMetaWALProvider</a>()</pre>
+<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.501">getMetaWALProvider</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
index c37a18b..35852ba 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
@@ -251,10 +251,14 @@
 <td class="colLast"><span class="typeNameLabel">WALFactory.Providers.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html#clazz">clazz</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>(package private) static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
+<td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER_CLASS">DEFAULT_WAL_PROVIDER_CLASS</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#metaProvider">metaProvider</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionGroupingProvider.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#providerClass">providerClass</a></span></code>&nbsp;</td>
 </tr>
@@ -302,7 +306,8 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clsKey,
+                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;defaultValue)</code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index bcb1724..c6caa9b 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -191,8 +191,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/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 13b8642..cf0f796 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 Oct 10 14:44:02 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Thu Oct 11 14:44:19 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 = "cb31728438a46d6fb733c748cc646f37";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "9567fbd68d8644485c69dcccfa2a19e0";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[04/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
index 080823f..1b350c9 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
@@ -35,265 +35,268 @@
 <span class="sourceLineNo">027</span>import java.util.Collection;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Collections;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileSystem;<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.HConstants;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>// imports for things that haven't moved from regionserver.wal yet.<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * A WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * interactions with HDFS.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * &lt;p&gt;<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * separated list of allowed operations:<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;ul&gt;<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * filesystem.&lt;/li&gt;<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * &lt;/ul&gt;<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * also undefined if values not listed above are included.<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * no-ops.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;p&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> */<a name="line.69"></a>
-<span class="sourceLineNo">070</span>@InterfaceAudience.Private<a name="line.70"></a>
-<span class="sourceLineNo">071</span>public class IOTestProvider implements WALProvider {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private enum AllowedOperations {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    all,<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    append,<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    sync,<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    fileroll,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    none<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>  private WALFactory factory;<a name="line.83"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.Path;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HConstants;<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>// imports for things that haven't moved from regionserver.wal yet.<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.slf4j.Logger;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.slf4j.LoggerFactory;<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 WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * interactions with HDFS.<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * &lt;p&gt;<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * separated list of allowed operations:<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * &lt;ul&gt;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * filesystem.&lt;/li&gt;<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;/ul&gt;<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * also undefined if values not listed above are included.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;p&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * no-ops.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<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 class IOTestProvider implements WALProvider {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private enum AllowedOperations {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    all,<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    append,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    sync,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    fileroll,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    none<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
 <span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private Configuration conf;<a name="line.85"></a>
+<span class="sourceLineNo">085</span>  private WALFactory factory;<a name="line.85"></a>
 <span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private volatile FSHLog log;<a name="line.87"></a>
+<span class="sourceLineNo">087</span>  private Configuration conf;<a name="line.87"></a>
 <span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private String providerId;<a name="line.89"></a>
+<span class="sourceLineNo">089</span>  private volatile FSHLog log;<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @param conf may not be null<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   *                   null<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @Override<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    if (factory != null) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    this.factory = factory;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this.conf = conf;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public List&lt;WAL&gt; getWALs() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    return Collections.singletonList(log);<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>  private FSHLog createWAL() throws IOException {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<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>  @Override<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FSHLog log = this.log;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (log != null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return log;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    synchronized (this) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      log = this.log;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      if (log == null) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        log = createWAL();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        this.log = log;<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>    return log;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public void close() throws IOException {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    FSHLog log = this.log;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    if (log != null) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      log.close();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public void shutdown() throws IOException {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    FSHLog log = this.log;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (log != null) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      log.shutdown();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static class IOTestWAL extends FSHLog {<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final boolean doFileRolls;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    private final boolean initialized;<a name="line.158"></a>
+<span class="sourceLineNo">091</span>  private String providerId;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  protected AtomicBoolean initialized = new AtomicBoolean(false);<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * @param conf may not be null<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   *                   null<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    if (!initialized.compareAndSet(false, true)) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    this.factory = factory;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    this.conf = conf;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<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>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public List&lt;WAL&gt; getWALs() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return Collections.singletonList(log);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private FSHLog createWAL() throws IOException {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @Override<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    FSHLog log = this.log;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (log != null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      return log;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    synchronized (this) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      log = this.log;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (log == null) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        log = createWAL();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        this.log = log;<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>    return log;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public void close() throws IOException {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    FSHLog log = this.log;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (log != null) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      log.close();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public void shutdown() throws IOException {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    FSHLog log = this.log;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (log != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      log.shutdown();<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>  private static class IOTestWAL extends FSHLog {<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    private final boolean doFileRolls;<a name="line.158"></a>
 <span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>     *<a name="line.162"></a>
-<span class="sourceLineNo">163</span>     * You should never have to load an existing log. If there is a log at<a name="line.163"></a>
-<span class="sourceLineNo">164</span>     * startup, it should have already been processed and deleted by the time the<a name="line.164"></a>
-<span class="sourceLineNo">165</span>     * WAL object is started up.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>     *<a name="line.166"></a>
-<span class="sourceLineNo">167</span>     * @param fs filesystem handle<a name="line.167"></a>
-<span class="sourceLineNo">168</span>     * @param rootDir path to where logs and oldlogs<a name="line.168"></a>
-<span class="sourceLineNo">169</span>     * @param logDir dir where wals are stored<a name="line.169"></a>
-<span class="sourceLineNo">170</span>     * @param archiveDir dir where wals are archived<a name="line.170"></a>
-<span class="sourceLineNo">171</span>     * @param conf configuration to use<a name="line.171"></a>
-<span class="sourceLineNo">172</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.172"></a>
-<span class="sourceLineNo">173</span>     * be registered before we do anything else; e.g. the<a name="line.173"></a>
-<span class="sourceLineNo">174</span>     * Constructor {@link #rollWriter()}.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.175"></a>
-<span class="sourceLineNo">176</span>     *        already exist.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.177"></a>
-<span class="sourceLineNo">178</span>     *        it will be URL encoded before being used.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>     *        If prefix is null, "wal" will be used<a name="line.179"></a>
-<span class="sourceLineNo">180</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.180"></a>
-<span class="sourceLineNo">181</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.181"></a>
-<span class="sourceLineNo">182</span>     * @throws IOException<a name="line.182"></a>
-<span class="sourceLineNo">183</span>     */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        final String archiveDir, final Configuration conf,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        throws IOException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.191"></a>
-<span class="sourceLineNo">192</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      initialized = true;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<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>    private Writer noRollsWriter;<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // if we are skipping it, just keep returning the same writer.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    @Override<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // we don't know yet if we're supposed to generally roll and<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (!initialized || doFileRolls) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.info("creating new writer instance.");<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        try {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>              "doesn't support needed stream capabilities.", exception);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        if (!initialized) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>          noRollsWriter = writer;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        return writer;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      } else {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        // a race for first assignment.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        return noRollsWriter;<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    private boolean doAppends;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    private boolean doSyncs;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>    @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        doAppends = doSyncs = true;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        doAppends = doSyncs = false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      } else {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected String getWriterClassName() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return ProtobufLogWriter.class.getSimpleName();<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>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public void append(Entry entry) throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (doAppends) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        super.append(entry);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    @Override<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    public void sync(boolean forceSync) throws IOException {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (doSyncs) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        super.sync(forceSync);<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><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getNumLogFiles() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.log.getNumLogFiles();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public long getLogFileSize() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // TODO Implement WALProvider.addWALActionLister<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>}<a name="line.288"></a>
+<span class="sourceLineNo">160</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    private final boolean initialized;<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>     *<a name="line.165"></a>
+<span class="sourceLineNo">166</span>     * You should never have to load an existing log. If there is a log at<a name="line.166"></a>
+<span class="sourceLineNo">167</span>     * startup, it should have already been processed and deleted by the time the<a name="line.167"></a>
+<span class="sourceLineNo">168</span>     * WAL object is started up.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>     *<a name="line.169"></a>
+<span class="sourceLineNo">170</span>     * @param fs filesystem handle<a name="line.170"></a>
+<span class="sourceLineNo">171</span>     * @param rootDir path to where logs and oldlogs<a name="line.171"></a>
+<span class="sourceLineNo">172</span>     * @param logDir dir where wals are stored<a name="line.172"></a>
+<span class="sourceLineNo">173</span>     * @param archiveDir dir where wals are archived<a name="line.173"></a>
+<span class="sourceLineNo">174</span>     * @param conf configuration to use<a name="line.174"></a>
+<span class="sourceLineNo">175</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.175"></a>
+<span class="sourceLineNo">176</span>     * be registered before we do anything else; e.g. the<a name="line.176"></a>
+<span class="sourceLineNo">177</span>     * Constructor {@link #rollWriter()}.<a name="line.177"></a>
+<span class="sourceLineNo">178</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.178"></a>
+<span class="sourceLineNo">179</span>     *        already exist.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.180"></a>
+<span class="sourceLineNo">181</span>     *        it will be URL encoded before being used.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>     *        If prefix is null, "wal" will be used<a name="line.182"></a>
+<span class="sourceLineNo">183</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.183"></a>
+<span class="sourceLineNo">184</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.184"></a>
+<span class="sourceLineNo">185</span>     * @throws IOException<a name="line.185"></a>
+<span class="sourceLineNo">186</span>     */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        final String archiveDir, final Configuration conf,<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        throws IOException {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      initialized = true;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>    private Writer noRollsWriter;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // if we are skipping it, just keep returning the same writer.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    @Override<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // we don't know yet if we're supposed to generally roll and<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      if (!initialized || doFileRolls) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        LOG.info("creating new writer instance.");<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        try {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.215"></a>
+<span class="sourceLineNo">216</span>              "doesn't support needed stream capabilities.", exception);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        if (!initialized) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          noRollsWriter = writer;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        return writer;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      } else {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        // a race for first assignment.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        return noRollsWriter;<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>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    private boolean doAppends;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    private boolean doSyncs;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        doAppends = doSyncs = true;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        doAppends = doSyncs = false;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      } else {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    protected String getWriterClassName() {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return ProtobufLogWriter.class.getSimpleName();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public void append(Entry entry) throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (doAppends) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        super.append(entry);<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>    @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public void sync(boolean forceSync) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (doSyncs) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        super.sync(forceSync);<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">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public long getNumLogFiles() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    return this.log.getNumLogFiles();<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>  @Override<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  public long getLogFileSize() {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // TODO Implement WALProvider.addWALActionLister<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>
 
 
 


[06/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
index 92967f2..d69bb8c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
@@ -88,404 +88,428 @@
 <span class="sourceLineNo">080</span><a name="line.80"></a>
 <span class="sourceLineNo">081</span>  public static final String WAL_PROVIDER = "hbase.wal.provider";<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  static final String DEFAULT_WAL_PROVIDER = Providers.defaultProvider.name();<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.84"></a>
+<span class="sourceLineNo">083</span>  public static final String WAL_PROVIDER_CLASS = "hbase.wal.provider.class";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  static final Class&lt;? extends WALProvider&gt; DEFAULT_WAL_PROVIDER_CLASS = AsyncFSWALProvider.class;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  final String factoryId;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private final WALProvider provider;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // The meta updates are written to a different wal. If this<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  private final int timeoutMillis;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private final Configuration conf;<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  // Used for the singleton WALFactory, see below.<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private WALFactory(Configuration conf) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    // this code is duplicated here so we can keep our members final.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      AbstractFSWALProvider.Reader.class);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    this.conf = conf;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // end required early initialization<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // this instance can't create wals, just reader/writers.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    provider = null;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    factoryId = SINGLETON_ID;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  @VisibleForTesting<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  Providers getDefaultProvider() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return Providers.defaultProvider;<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>  @VisibleForTesting<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    try {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      // all versions.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        // easily broken when upgrading hadoop.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        return FSHLogProvider.class;<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>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      // not fall back to FSHLogProvider.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return provider.clazz;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    } catch (IllegalArgumentException exception) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      // Fall back to them specifying a class name<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      // when there is a config value present.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.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>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    try {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    } catch (Exception e) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      throw new IOException("couldn't set up WALProvider", e);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *          instances.<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   *          to make a directory<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    this(conf, factoryId, true);<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>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   *          instances.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   *          to make a directory<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   *          {@link SyncReplicationWALProvider}<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      throws IOException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      AbstractFSWALProvider.Reader.class);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    this.conf = conf;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    this.factoryId = factoryId;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // end required early initialization<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      if (enableSyncReplicationWALProvider) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      provider.init(this, conf, null);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      this.provider = provider;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    } else {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // special handling of existing configuration behavior.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      LOG.warn("Running with WAL disabled.");<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      provider = new DisabledWALProvider();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      provider.init(this, conf, factoryId);<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>   * Shutdown all WALs and clean up any underlying storage.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * factory.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  public void close() throws IOException {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    if (null != metaProvider) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      metaProvider.close();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // within the getInstance method.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    if (null != provider) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      provider.close();<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><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public void shutdown() throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    IOException exception = null;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (null != metaProvider) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        metaProvider.shutdown();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } catch(IOException ioe) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        exception = ioe;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
+<span class="sourceLineNo">086</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public static final String META_WAL_PROVIDER_CLASS = "hbase.wal.meta_provider.class";<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  final String factoryId;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private final WALProvider provider;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  // The meta updates are written to a different wal. If this<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private final int timeoutMillis;<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private final Configuration conf;<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  // Used for the singleton WALFactory, see below.<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private WALFactory(Configuration conf) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    // this code is duplicated here so we can keep our members final.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      AbstractFSWALProvider.Reader.class);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    this.conf = conf;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // end required early initialization<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>    // this instance can't create wals, just reader/writers.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    provider = null;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    factoryId = SINGLETON_ID;<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>  @VisibleForTesting<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  Providers getDefaultProvider() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    return Providers.defaultProvider;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @VisibleForTesting<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  /*<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @param clsKey config key for provider classname<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param key config key for provider enum<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @param defaultValue default value for provider enum<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @return Class which extends WALProvider<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String clsKey, String key,<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      String defaultValue) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    String clsName = conf.get(clsKey);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (clsName == null || clsName.isEmpty()) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      clsName = conf.get(key, defaultValue);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (clsName != null &amp;&amp; !clsName.isEmpty()) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      try {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        return (Class&lt;? extends WALProvider&gt;) Class.forName(clsName);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      } catch (ClassNotFoundException exception) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        // try with enum key next<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    try {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      // all versions.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        // easily broken when upgrading hadoop.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        return FSHLogProvider.class;<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>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      // not fall back to FSHLogProvider.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return provider.clazz;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } catch (IllegalArgumentException exception) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      // Fall back to them specifying a class name<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      // when there is a config value present.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      return conf.getClass(key, AsyncFSWALProvider.class, WALProvider.class);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    try {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    } catch (Exception e) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      throw new IOException("couldn't set up WALProvider", e);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   *          instances.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *          to make a directory<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    this(conf, factoryId, true);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          instances.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   *          to make a directory<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   *          {@link SyncReplicationWALProvider}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      throws IOException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      AbstractFSWALProvider.Reader.class);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    this.conf = conf;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    this.factoryId = factoryId;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    // end required early initialization<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      WALProvider provider = createProvider(<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          getProviderClass(WAL_PROVIDER_CLASS, WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      if (enableSyncReplicationWALProvider) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      provider.init(this, conf, null);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      this.provider = provider;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    } else {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      // special handling of existing configuration behavior.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      LOG.warn("Running with WAL disabled.");<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      provider = new DisabledWALProvider();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      provider.init(this, conf, factoryId);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * factory.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void close() throws IOException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    if (null != metaProvider) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      metaProvider.close();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    provider.shutdown();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    if (null != exception) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      throw exception;<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>  public List&lt;WAL&gt; getWALs() {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    return provider.getWALs();<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>  @VisibleForTesting<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  WALProvider getMetaProvider() throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    for (;;) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      WALProvider provider = this.metaProvider.get();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (provider != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        return provider;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        return provider;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      } else {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        // someone is ahead of us, close and try again.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        provider.close();<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">274</span>  }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // use different WAL for hbase:meta<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return getMetaProvider().getWAL(region);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      return provider.getWAL(region);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    return createReader(fs, path, (CancelableProgressable)null);<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>  /**<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * then just seek back to the last known good position.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @return A WAL reader.  Close when done with it.<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      CancelableProgressable reporter) throws IOException {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    return createReader(fs, path, reporter, true);<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>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      boolean allowCustom) throws IOException {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    try {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // A wal file could be under recovery, so it may take several<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // to open it up to 5 minutes by default.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      int nbAttempt = 0;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      while (true) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        try {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          reader.init(fs, path, conf, null);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          return reader;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        } catch (IOException e) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          if (reader != null) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>              reader.close();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>            } catch (IOException exception) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.327"></a>
-<span class="sourceLineNo">328</span>              LOG.debug("exception details", exception);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>          String msg = e.getMessage();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          if (msg != null<a name="line.333"></a>
-<span class="sourceLineNo">334</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>            if (++nbAttempt == 1) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.341"></a>
-<span class="sourceLineNo">342</span>            }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              try {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>                continue; // retry<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              } catch (InterruptedException ie) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.351"></a>
-<span class="sourceLineNo">352</span>                iioe.initCause(ie);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                throw iioe;<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>            throw new LeaseNotRecoveredException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          } else {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>            throw e;<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>    } catch (IOException ie) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      throw ie;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } catch (Exception e) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      throw new IOException("Cannot get log reader", e);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
-<span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  /**<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * Create a writer for the WAL.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * Uses defaults.<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * &lt;p&gt;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Should be package-private. public only for tests and<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @return A WAL writer. Close when done with it.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<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>  /**<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * Should be package-private, visible for recovery testing.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * Uses defaults.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @VisibleForTesting<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      throws IOException {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<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>  // These static methods are currently used where it's impractical to<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  // WALFactory that just provides Reader / Writers.<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  <a name="line.398"></a>
-<span class="sourceLineNo">399</span>  // Public only for FSHLog<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    WALFactory factory = singleton.get();<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (null == factory) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      WALFactory temp = new WALFactory(configuration);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        factory = temp;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      } else {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        // someone else beat us to initializing<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        try {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          temp.close();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } catch (IOException exception) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        factory = singleton.get();<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>    return factory;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>  /**<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return a WAL Reader, caller must close.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final Configuration configuration) throws IOException {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * @return a WAL Reader, caller must close.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  /**<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @return a WAL Reader, caller must close.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      final Configuration configuration) throws IOException {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>  /**<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * Uses defaults.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      final Configuration configuration)<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      throws IOException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * Uses defaults.<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   */<a name="line.465"></a>
-<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      final Configuration configuration)<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      throws IOException {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  public final WALProvider getWALProvider() {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return this.provider;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  public final WALProvider getMetaWALProvider() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    return this.metaProvider.get();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>}<a name="line.480"></a>
+<span class="sourceLineNo">246</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // within the getInstance method.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (null != provider) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      provider.close();<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><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  /**<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  public void shutdown() throws IOException {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    IOException exception = null;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    if (null != metaProvider) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      try {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        metaProvider.shutdown();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      } catch(IOException ioe) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        exception = ioe;<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>    provider.shutdown();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if (null != exception) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throw exception;<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">274</span>  public List&lt;WAL&gt; getWALs() {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return provider.getWALs();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  WALProvider getMetaProvider() throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    for (;;) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      WALProvider provider = this.metaProvider.get();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      if (provider != null) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        return provider;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      boolean metaWALProvPresent = conf.get(META_WAL_PROVIDER_CLASS) != null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      provider = createProvider(getProviderClass(<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          metaWALProvPresent ? META_WAL_PROVIDER_CLASS : WAL_PROVIDER_CLASS,<a name="line.287"></a>
+<span class="sourceLineNo">288</span>          META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return provider;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } else {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        // someone is ahead of us, close and try again.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        provider.close();<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>  }<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>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    // use different WAL for hbase:meta<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      return getMetaProvider().getWAL(region);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    } else {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return provider.getWAL(region);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    return createReader(fs, path, (CancelableProgressable)null);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>  /**<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * then just seek back to the last known good position.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * @return A WAL reader.  Close when done with it.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * @throws IOException<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      CancelableProgressable reporter) throws IOException {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    return createReader(fs, path, reporter, true);<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>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      boolean allowCustom) throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    try {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // A wal file could be under recovery, so it may take several<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      // to open it up to 5 minutes by default.<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      int nbAttempt = 0;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      while (true) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          reader.init(fs, path, conf, null);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          return reader;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        } catch (IOException e) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          if (reader != null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>            try {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>              reader.close();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            } catch (IOException exception) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>              LOG.debug("exception details", exception);<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>          String msg = e.getMessage();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          if (msg != null<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.358"></a>
+<span class="sourceLineNo">359</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.359"></a>
+<span class="sourceLineNo">360</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>            if (++nbAttempt == 1) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.365"></a>
+<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.368"></a>
+<span class="sourceLineNo">369</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>            } else {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>              try {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>                continue; // retry<a name="line.373"></a>
+<span class="sourceLineNo">374</span>              } catch (InterruptedException ie) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.375"></a>
+<span class="sourceLineNo">376</span>                iioe.initCause(ie);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                throw iioe;<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>            throw new LeaseNotRecoveredException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          } else {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>            throw e;<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    } catch (IOException ie) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      throw ie;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    } catch (Exception e) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      throw new IOException("Cannot get log reader", e);<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>  /**<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * Create a writer for the WAL.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * Uses defaults.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * &lt;p&gt;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Should be package-private. public only for tests and<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * @return A WAL writer. Close when done with it.<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   */<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
+<span class="sourceLineNo">404</span><a name="line.404"></a>
+<span class="sourceLineNo">405</span>  /**<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   * Should be package-private, visible for recovery testing.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Uses defaults.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @VisibleForTesting<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      throws IOException {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<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>  // These static methods are currently used where it's impractical to<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  // WALFactory that just provides Reader / Writers.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  <a name="line.422"></a>
+<span class="sourceLineNo">423</span>  // Public only for FSHLog<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    WALFactory factory = singleton.get();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    if (null == factory) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      WALFactory temp = new WALFactory(configuration);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        factory = temp;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        // someone else beat us to initializing<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        try {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          temp.close();<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        } catch (IOException exception) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        factory = singleton.get();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    return factory;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  /**<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return a WAL Reader, caller must close.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final Configuration configuration) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    return getInstance(configuration).createReader(fs, path);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * @return a WAL Reader, caller must close.<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * @return a WAL Reader, caller must close.<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
+<span class="sourceLineNo">469</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      final Configuration configuration) throws IOException {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>  /**<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * Uses defaults.<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   */<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      final Configuration configuration)<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      throws IOException {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
+<span class="sourceLineNo">486</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>   * Uses defaults.<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   */<a name="line.489"></a>
+<span class="sourceLineNo">490</span>  @VisibleForTesting<a name="line.490"></a>
+<span class="sourceLineNo">491</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      final Configuration configuration)<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      throws IOException {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public final WALProvider getWALProvider() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return this.provider;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  public final WALProvider getMetaWALProvider() {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return this.metaProvider.get();<a name="line.502"></a>
+<span class="sourceLineNo">503</span>  }<a name="line.503"></a>
+<span class="sourceLineNo">504</span>}<a name="line.504"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 28cce67..6ba0cc1 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -423,7 +423,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-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index f208a8b..13bbb7a 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -331,7 +331,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 6a03e9c..e5868b3 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -411,7 +411,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index b5e8683..838a113 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 8f44146..d89d18c 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 


[09/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
index be2a512..2142742 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
@@ -129,171 +129,174 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
+<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return provider;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        lock.unlock();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    return provider.getWAL(null);<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>  @Override<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerId = sb.toString();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    return getWAL(group);<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>  @Override<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        failure = e;<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>  }<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
+<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<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><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    listeners.add(listener);<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">250</span>    if (failure != null) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      throw failure;<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<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>  @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return logFileSize;<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>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    listeners.add(listener);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
index be2a512..2142742 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
@@ -129,171 +129,174 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
+<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return provider;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        lock.unlock();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    return provider.getWAL(null);<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>  @Override<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerId = sb.toString();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    return getWAL(group);<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>  @Override<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        failure = e;<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>  }<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
+<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<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><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    listeners.add(listener);<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">250</span>    if (failure != null) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      throw failure;<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<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>  @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return logFileSize;<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>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    listeners.add(listener);<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>
 
 
 


[02/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
index 080823f..1b350c9 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
@@ -35,265 +35,268 @@
 <span class="sourceLineNo">027</span>import java.util.Collection;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Collections;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileSystem;<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.HConstants;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>// imports for things that haven't moved from regionserver.wal yet.<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * A WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * interactions with HDFS.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * &lt;p&gt;<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * separated list of allowed operations:<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;ul&gt;<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * filesystem.&lt;/li&gt;<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * &lt;/ul&gt;<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * also undefined if values not listed above are included.<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * no-ops.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;p&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> */<a name="line.69"></a>
-<span class="sourceLineNo">070</span>@InterfaceAudience.Private<a name="line.70"></a>
-<span class="sourceLineNo">071</span>public class IOTestProvider implements WALProvider {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private enum AllowedOperations {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    all,<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    append,<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    sync,<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    fileroll,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    none<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>  private WALFactory factory;<a name="line.83"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.Path;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HConstants;<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>// imports for things that haven't moved from regionserver.wal yet.<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.slf4j.Logger;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.slf4j.LoggerFactory;<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 WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * interactions with HDFS.<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * &lt;p&gt;<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * separated list of allowed operations:<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * &lt;ul&gt;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * filesystem.&lt;/li&gt;<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;/ul&gt;<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * also undefined if values not listed above are included.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;p&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * no-ops.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<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 class IOTestProvider implements WALProvider {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private enum AllowedOperations {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    all,<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    append,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    sync,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    fileroll,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    none<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
 <span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private Configuration conf;<a name="line.85"></a>
+<span class="sourceLineNo">085</span>  private WALFactory factory;<a name="line.85"></a>
 <span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private volatile FSHLog log;<a name="line.87"></a>
+<span class="sourceLineNo">087</span>  private Configuration conf;<a name="line.87"></a>
 <span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private String providerId;<a name="line.89"></a>
+<span class="sourceLineNo">089</span>  private volatile FSHLog log;<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @param conf may not be null<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   *                   null<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @Override<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    if (factory != null) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    this.factory = factory;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this.conf = conf;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public List&lt;WAL&gt; getWALs() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    return Collections.singletonList(log);<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>  private FSHLog createWAL() throws IOException {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<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>  @Override<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FSHLog log = this.log;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (log != null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return log;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    synchronized (this) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      log = this.log;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      if (log == null) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        log = createWAL();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        this.log = log;<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>    return log;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public void close() throws IOException {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    FSHLog log = this.log;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    if (log != null) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      log.close();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public void shutdown() throws IOException {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    FSHLog log = this.log;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (log != null) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      log.shutdown();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static class IOTestWAL extends FSHLog {<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final boolean doFileRolls;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    private final boolean initialized;<a name="line.158"></a>
+<span class="sourceLineNo">091</span>  private String providerId;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  protected AtomicBoolean initialized = new AtomicBoolean(false);<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * @param conf may not be null<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   *                   null<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    if (!initialized.compareAndSet(false, true)) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    this.factory = factory;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    this.conf = conf;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<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>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public List&lt;WAL&gt; getWALs() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return Collections.singletonList(log);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private FSHLog createWAL() throws IOException {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @Override<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    FSHLog log = this.log;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (log != null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      return log;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    synchronized (this) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      log = this.log;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (log == null) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        log = createWAL();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        this.log = log;<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>    return log;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public void close() throws IOException {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    FSHLog log = this.log;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (log != null) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      log.close();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public void shutdown() throws IOException {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    FSHLog log = this.log;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (log != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      log.shutdown();<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>  private static class IOTestWAL extends FSHLog {<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    private final boolean doFileRolls;<a name="line.158"></a>
 <span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>     *<a name="line.162"></a>
-<span class="sourceLineNo">163</span>     * You should never have to load an existing log. If there is a log at<a name="line.163"></a>
-<span class="sourceLineNo">164</span>     * startup, it should have already been processed and deleted by the time the<a name="line.164"></a>
-<span class="sourceLineNo">165</span>     * WAL object is started up.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>     *<a name="line.166"></a>
-<span class="sourceLineNo">167</span>     * @param fs filesystem handle<a name="line.167"></a>
-<span class="sourceLineNo">168</span>     * @param rootDir path to where logs and oldlogs<a name="line.168"></a>
-<span class="sourceLineNo">169</span>     * @param logDir dir where wals are stored<a name="line.169"></a>
-<span class="sourceLineNo">170</span>     * @param archiveDir dir where wals are archived<a name="line.170"></a>
-<span class="sourceLineNo">171</span>     * @param conf configuration to use<a name="line.171"></a>
-<span class="sourceLineNo">172</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.172"></a>
-<span class="sourceLineNo">173</span>     * be registered before we do anything else; e.g. the<a name="line.173"></a>
-<span class="sourceLineNo">174</span>     * Constructor {@link #rollWriter()}.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.175"></a>
-<span class="sourceLineNo">176</span>     *        already exist.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.177"></a>
-<span class="sourceLineNo">178</span>     *        it will be URL encoded before being used.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>     *        If prefix is null, "wal" will be used<a name="line.179"></a>
-<span class="sourceLineNo">180</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.180"></a>
-<span class="sourceLineNo">181</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.181"></a>
-<span class="sourceLineNo">182</span>     * @throws IOException<a name="line.182"></a>
-<span class="sourceLineNo">183</span>     */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        final String archiveDir, final Configuration conf,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        throws IOException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.191"></a>
-<span class="sourceLineNo">192</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      initialized = true;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<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>    private Writer noRollsWriter;<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // if we are skipping it, just keep returning the same writer.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    @Override<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // we don't know yet if we're supposed to generally roll and<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (!initialized || doFileRolls) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.info("creating new writer instance.");<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        try {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>              "doesn't support needed stream capabilities.", exception);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        if (!initialized) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>          noRollsWriter = writer;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        return writer;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      } else {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        // a race for first assignment.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        return noRollsWriter;<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    private boolean doAppends;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    private boolean doSyncs;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>    @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        doAppends = doSyncs = true;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        doAppends = doSyncs = false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      } else {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected String getWriterClassName() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return ProtobufLogWriter.class.getSimpleName();<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>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public void append(Entry entry) throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (doAppends) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        super.append(entry);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    @Override<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    public void sync(boolean forceSync) throws IOException {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (doSyncs) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        super.sync(forceSync);<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><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getNumLogFiles() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.log.getNumLogFiles();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public long getLogFileSize() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // TODO Implement WALProvider.addWALActionLister<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>}<a name="line.288"></a>
+<span class="sourceLineNo">160</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    private final boolean initialized;<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>     *<a name="line.165"></a>
+<span class="sourceLineNo">166</span>     * You should never have to load an existing log. If there is a log at<a name="line.166"></a>
+<span class="sourceLineNo">167</span>     * startup, it should have already been processed and deleted by the time the<a name="line.167"></a>
+<span class="sourceLineNo">168</span>     * WAL object is started up.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>     *<a name="line.169"></a>
+<span class="sourceLineNo">170</span>     * @param fs filesystem handle<a name="line.170"></a>
+<span class="sourceLineNo">171</span>     * @param rootDir path to where logs and oldlogs<a name="line.171"></a>
+<span class="sourceLineNo">172</span>     * @param logDir dir where wals are stored<a name="line.172"></a>
+<span class="sourceLineNo">173</span>     * @param archiveDir dir where wals are archived<a name="line.173"></a>
+<span class="sourceLineNo">174</span>     * @param conf configuration to use<a name="line.174"></a>
+<span class="sourceLineNo">175</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.175"></a>
+<span class="sourceLineNo">176</span>     * be registered before we do anything else; e.g. the<a name="line.176"></a>
+<span class="sourceLineNo">177</span>     * Constructor {@link #rollWriter()}.<a name="line.177"></a>
+<span class="sourceLineNo">178</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.178"></a>
+<span class="sourceLineNo">179</span>     *        already exist.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.180"></a>
+<span class="sourceLineNo">181</span>     *        it will be URL encoded before being used.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>     *        If prefix is null, "wal" will be used<a name="line.182"></a>
+<span class="sourceLineNo">183</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.183"></a>
+<span class="sourceLineNo">184</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.184"></a>
+<span class="sourceLineNo">185</span>     * @throws IOException<a name="line.185"></a>
+<span class="sourceLineNo">186</span>     */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        final String archiveDir, final Configuration conf,<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        throws IOException {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      initialized = true;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>    private Writer noRollsWriter;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // if we are skipping it, just keep returning the same writer.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    @Override<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // we don't know yet if we're supposed to generally roll and<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      if (!initialized || doFileRolls) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        LOG.info("creating new writer instance.");<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        try {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.215"></a>
+<span class="sourceLineNo">216</span>              "doesn't support needed stream capabilities.", exception);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        if (!initialized) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          noRollsWriter = writer;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        return writer;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      } else {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        // a race for first assignment.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        return noRollsWriter;<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>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    private boolean doAppends;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    private boolean doSyncs;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        doAppends = doSyncs = true;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        doAppends = doSyncs = false;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      } else {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    protected String getWriterClassName() {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return ProtobufLogWriter.class.getSimpleName();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public void append(Entry entry) throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (doAppends) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        super.append(entry);<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>    @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public void sync(boolean forceSync) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (doSyncs) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        super.sync(forceSync);<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">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public long getNumLogFiles() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    return this.log.getNumLogFiles();<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>  @Override<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  public long getLogFileSize() {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // TODO Implement WALProvider.addWALActionLister<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>
 
 
 


[07/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
index 92967f2..d69bb8c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
@@ -88,404 +88,428 @@
 <span class="sourceLineNo">080</span><a name="line.80"></a>
 <span class="sourceLineNo">081</span>  public static final String WAL_PROVIDER = "hbase.wal.provider";<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  static final String DEFAULT_WAL_PROVIDER = Providers.defaultProvider.name();<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.84"></a>
+<span class="sourceLineNo">083</span>  public static final String WAL_PROVIDER_CLASS = "hbase.wal.provider.class";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  static final Class&lt;? extends WALProvider&gt; DEFAULT_WAL_PROVIDER_CLASS = AsyncFSWALProvider.class;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  final String factoryId;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private final WALProvider provider;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // The meta updates are written to a different wal. If this<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  private final int timeoutMillis;<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private final Configuration conf;<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  // Used for the singleton WALFactory, see below.<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private WALFactory(Configuration conf) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    // this code is duplicated here so we can keep our members final.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      AbstractFSWALProvider.Reader.class);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    this.conf = conf;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // end required early initialization<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // this instance can't create wals, just reader/writers.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    provider = null;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    factoryId = SINGLETON_ID;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  @VisibleForTesting<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  Providers getDefaultProvider() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return Providers.defaultProvider;<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>  @VisibleForTesting<a name="line.127"></a>
-<span class="sourceLineNo">128</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    try {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      // all versions.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.138"></a>
-<span class="sourceLineNo">139</span>        // easily broken when upgrading hadoop.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        return FSHLogProvider.class;<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>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      // not fall back to FSHLogProvider.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      return provider.clazz;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    } catch (IllegalArgumentException exception) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      // Fall back to them specifying a class name<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      // when there is a config value present.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.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>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    try {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    } catch (Exception e) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      throw new IOException("couldn't set up WALProvider", e);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *          instances.<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   *          to make a directory<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    this(conf, factoryId, true);<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>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   *          instances.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   *          to make a directory<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   *          {@link SyncReplicationWALProvider}<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      throws IOException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      AbstractFSWALProvider.Reader.class);<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    this.conf = conf;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    this.factoryId = factoryId;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    // end required early initialization<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      if (enableSyncReplicationWALProvider) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      provider.init(this, conf, null);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      this.provider = provider;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    } else {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      // special handling of existing configuration behavior.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      LOG.warn("Running with WAL disabled.");<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      provider = new DisabledWALProvider();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      provider.init(this, conf, factoryId);<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>   * Shutdown all WALs and clean up any underlying storage.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * factory.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  public void close() throws IOException {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    if (null != metaProvider) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      metaProvider.close();<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    // within the getInstance method.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    if (null != provider) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      provider.close();<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><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public void shutdown() throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    IOException exception = null;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (null != metaProvider) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        metaProvider.shutdown();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } catch(IOException ioe) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        exception = ioe;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
+<span class="sourceLineNo">086</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public static final String META_WAL_PROVIDER_CLASS = "hbase.wal.meta_provider.class";<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  final String factoryId;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private final WALProvider provider;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  // The meta updates are written to a different wal. If this<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private final int timeoutMillis;<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private final Configuration conf;<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  // Used for the singleton WALFactory, see below.<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private WALFactory(Configuration conf) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    // this code is duplicated here so we can keep our members final.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      AbstractFSWALProvider.Reader.class);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    this.conf = conf;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // end required early initialization<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>    // this instance can't create wals, just reader/writers.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    provider = null;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    factoryId = SINGLETON_ID;<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>  @VisibleForTesting<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  Providers getDefaultProvider() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    return Providers.defaultProvider;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  }<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @VisibleForTesting<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  /*<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @param clsKey config key for provider classname<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param key config key for provider enum<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @param defaultValue default value for provider enum<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @return Class which extends WALProvider<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String clsKey, String key,<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      String defaultValue) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    String clsName = conf.get(clsKey);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (clsName == null || clsName.isEmpty()) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      clsName = conf.get(key, defaultValue);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (clsName != null &amp;&amp; !clsName.isEmpty()) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      try {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>        return (Class&lt;? extends WALProvider&gt;) Class.forName(clsName);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      } catch (ClassNotFoundException exception) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        // try with enum key next<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    try {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      // all versions.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.158"></a>
+<span class="sourceLineNo">159</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        // easily broken when upgrading hadoop.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        return FSHLogProvider.class;<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>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      // not fall back to FSHLogProvider.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return provider.clazz;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } catch (IllegalArgumentException exception) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      // Fall back to them specifying a class name<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      // when there is a config value present.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      return conf.getClass(key, AsyncFSWALProvider.class, WALProvider.class);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    try {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    } catch (Exception e) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      throw new IOException("couldn't set up WALProvider", e);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   *          instances.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *          to make a directory<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    this(conf, factoryId, true);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          instances.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   *          to make a directory<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   *          {@link SyncReplicationWALProvider}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      throws IOException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      AbstractFSWALProvider.Reader.class);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    this.conf = conf;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    this.factoryId = factoryId;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    // end required early initialization<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      WALProvider provider = createProvider(<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          getProviderClass(WAL_PROVIDER_CLASS, WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      if (enableSyncReplicationWALProvider) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      provider.init(this, conf, null);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      this.provider = provider;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    } else {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      // special handling of existing configuration behavior.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      LOG.warn("Running with WAL disabled.");<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      provider = new DisabledWALProvider();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      provider.init(this, conf, factoryId);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * factory.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public void close() throws IOException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    if (null != metaProvider) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      metaProvider.close();<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    provider.shutdown();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    if (null != exception) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      throw exception;<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>  public List&lt;WAL&gt; getWALs() {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    return provider.getWALs();<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>  @VisibleForTesting<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  WALProvider getMetaProvider() throws IOException {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    for (;;) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      WALProvider provider = this.metaProvider.get();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (provider != null) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        return provider;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        return provider;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      } else {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        // someone is ahead of us, close and try again.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        provider.close();<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">274</span>  }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // use different WAL for hbase:meta<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return getMetaProvider().getWAL(region);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      return provider.getWAL(region);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    return createReader(fs, path, (CancelableProgressable)null);<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>  /**<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * then just seek back to the last known good position.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @return A WAL reader.  Close when done with it.<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      CancelableProgressable reporter) throws IOException {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    return createReader(fs, path, reporter, true);<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>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      boolean allowCustom) throws IOException {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    try {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // A wal file could be under recovery, so it may take several<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // to open it up to 5 minutes by default.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      int nbAttempt = 0;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      while (true) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        try {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          reader.init(fs, path, conf, null);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          return reader;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        } catch (IOException e) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>          if (reader != null) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>              reader.close();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>            } catch (IOException exception) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.327"></a>
-<span class="sourceLineNo">328</span>              LOG.debug("exception details", exception);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>            }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>          String msg = e.getMessage();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          if (msg != null<a name="line.333"></a>
-<span class="sourceLineNo">334</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>            if (++nbAttempt == 1) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.341"></a>
-<span class="sourceLineNo">342</span>            }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>              try {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.348"></a>
-<span class="sourceLineNo">349</span>                continue; // retry<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              } catch (InterruptedException ie) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.351"></a>
-<span class="sourceLineNo">352</span>                iioe.initCause(ie);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>                throw iioe;<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>            throw new LeaseNotRecoveredException(e);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          } else {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>            throw e;<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>    } catch (IOException ie) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      throw ie;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    } catch (Exception e) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      throw new IOException("Cannot get log reader", e);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
-<span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>  /**<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * Create a writer for the WAL.<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   * Uses defaults.<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * &lt;p&gt;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Should be package-private. public only for tests and<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @return A WAL writer. Close when done with it.<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<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>  /**<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * Should be package-private, visible for recovery testing.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * Uses defaults.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @VisibleForTesting<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      throws IOException {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<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>  // These static methods are currently used where it's impractical to<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  // WALFactory that just provides Reader / Writers.<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  <a name="line.398"></a>
-<span class="sourceLineNo">399</span>  // Public only for FSHLog<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    WALFactory factory = singleton.get();<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (null == factory) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      WALFactory temp = new WALFactory(configuration);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        factory = temp;<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      } else {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        // someone else beat us to initializing<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        try {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>          temp.close();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        } catch (IOException exception) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        factory = singleton.get();<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>    return factory;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>  /**<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return a WAL Reader, caller must close.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final Configuration configuration) throws IOException {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * @return a WAL Reader, caller must close.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  /**<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @return a WAL Reader, caller must close.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      final Configuration configuration) throws IOException {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span><a name="line.449"></a>
-<span class="sourceLineNo">450</span>  /**<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * Uses defaults.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      final Configuration configuration)<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      throws IOException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * Uses defaults.<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   */<a name="line.465"></a>
-<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
-<span class="sourceLineNo">467</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      final Configuration configuration)<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      throws IOException {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>  public final WALProvider getWALProvider() {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return this.provider;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  public final WALProvider getMetaWALProvider() {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    return this.metaProvider.get();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
-<span class="sourceLineNo">480</span>}<a name="line.480"></a>
+<span class="sourceLineNo">246</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // within the getInstance method.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (null != provider) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      provider.close();<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><a name="line.252"></a>
+<span class="sourceLineNo">253</span>  /**<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  public void shutdown() throws IOException {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    IOException exception = null;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    if (null != metaProvider) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      try {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        metaProvider.shutdown();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      } catch(IOException ioe) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        exception = ioe;<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>    provider.shutdown();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    if (null != exception) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      throw exception;<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">274</span>  public List&lt;WAL&gt; getWALs() {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    return provider.getWALs();<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
+<span class="sourceLineNo">277</span><a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  WALProvider getMetaProvider() throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    for (;;) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      WALProvider provider = this.metaProvider.get();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      if (provider != null) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>        return provider;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      boolean metaWALProvPresent = conf.get(META_WAL_PROVIDER_CLASS) != null;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      provider = createProvider(getProviderClass(<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          metaWALProvPresent ? META_WAL_PROVIDER_CLASS : WAL_PROVIDER_CLASS,<a name="line.287"></a>
+<span class="sourceLineNo">288</span>          META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return provider;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } else {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        // someone is ahead of us, close and try again.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        provider.close();<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>  }<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>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    // use different WAL for hbase:meta<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      return getMetaProvider().getWAL(region);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    } else {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      return provider.getWAL(region);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    return createReader(fs, path, (CancelableProgressable)null);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>  /**<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * then just seek back to the last known good position.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * @return A WAL reader.  Close when done with it.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * @throws IOException<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      CancelableProgressable reporter) throws IOException {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    return createReader(fs, path, reporter, true);<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>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      boolean allowCustom) throws IOException {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    try {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // A wal file could be under recovery, so it may take several<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      // to open it up to 5 minutes by default.<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      int nbAttempt = 0;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      while (true) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        try {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          reader.init(fs, path, conf, null);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>          return reader;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        } catch (IOException e) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          if (reader != null) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>            try {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>              reader.close();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            } catch (IOException exception) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>              LOG.debug("exception details", exception);<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>          String msg = e.getMessage();<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          if (msg != null<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.358"></a>
+<span class="sourceLineNo">359</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.359"></a>
+<span class="sourceLineNo">360</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>            if (++nbAttempt == 1) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.365"></a>
+<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.368"></a>
+<span class="sourceLineNo">369</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>            } else {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>              try {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>                continue; // retry<a name="line.373"></a>
+<span class="sourceLineNo">374</span>              } catch (InterruptedException ie) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.375"></a>
+<span class="sourceLineNo">376</span>                iioe.initCause(ie);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                throw iioe;<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>            throw new LeaseNotRecoveredException(e);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          } else {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>            throw e;<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    } catch (IOException ie) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      throw ie;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    } catch (Exception e) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      throw new IOException("Cannot get log reader", e);<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>  /**<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * Create a writer for the WAL.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * Uses defaults.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * &lt;p&gt;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Should be package-private. public only for tests and<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * @return A WAL writer. Close when done with it.<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   */<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
+<span class="sourceLineNo">404</span><a name="line.404"></a>
+<span class="sourceLineNo">405</span>  /**<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   * Should be package-private, visible for recovery testing.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Uses defaults.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  @VisibleForTesting<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      throws IOException {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<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>  // These static methods are currently used where it's impractical to<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  // WALFactory that just provides Reader / Writers.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  <a name="line.422"></a>
+<span class="sourceLineNo">423</span>  // Public only for FSHLog<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    WALFactory factory = singleton.get();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    if (null == factory) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      WALFactory temp = new WALFactory(configuration);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        factory = temp;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      } else {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        // someone else beat us to initializing<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        try {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          temp.close();<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        } catch (IOException exception) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        factory = singleton.get();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    return factory;<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  /**<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return a WAL Reader, caller must close.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final Configuration configuration) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    return getInstance(configuration).createReader(fs, path);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
+<span class="sourceLineNo">452</span><a name="line.452"></a>
+<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * @return a WAL Reader, caller must close.<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   * @return a WAL Reader, caller must close.<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
+<span class="sourceLineNo">469</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      final Configuration configuration) throws IOException {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>  /**<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * Uses defaults.<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   */<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      final Configuration configuration)<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      throws IOException {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.482"></a>
+<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
+<span class="sourceLineNo">486</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>   * Uses defaults.<a name="line.487"></a>
+<span class="sourceLineNo">488</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   */<a name="line.489"></a>
+<span class="sourceLineNo">490</span>  @VisibleForTesting<a name="line.490"></a>
+<span class="sourceLineNo">491</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      final Configuration configuration)<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      throws IOException {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public final WALProvider getWALProvider() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return this.provider;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  public final WALProvider getMetaWALProvider() {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    return this.metaProvider.get();<a name="line.502"></a>
+<span class="sourceLineNo">503</span>  }<a name="line.503"></a>
+<span class="sourceLineNo">504</span>}<a name="line.504"></a>
 
 
 


[08/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
index be2a512..2142742 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
@@ -129,171 +129,174 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
+<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return provider;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        lock.unlock();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    return provider.getWAL(null);<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>  @Override<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerId = sb.toString();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    return getWAL(group);<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>  @Override<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        failure = e;<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>  }<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
+<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<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><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    listeners.add(listener);<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">250</span>    if (failure != null) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      throw failure;<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<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>  @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return logFileSize;<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>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    listeners.add(listener);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
index be2a512..2142742 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
@@ -129,171 +129,174 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
+<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
+<span class="sourceLineNo">130</span><a name="line.130"></a>
+<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return provider;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        lock.unlock();<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    return provider.getWAL(null);<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>  @Override<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerId = sb.toString();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    return getWAL(group);<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>  @Override<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        failure = e;<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>  }<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
+<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<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><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    listeners.add(listener);<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">250</span>    if (failure != null) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      throw failure;<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<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>  @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return logFileSize;<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>  @Override<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    listeners.add(listener);<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>
 
 
 


[03/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
index 080823f..1b350c9 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
@@ -35,265 +35,268 @@
 <span class="sourceLineNo">027</span>import java.util.Collection;<a name="line.27"></a>
 <span class="sourceLineNo">028</span>import java.util.Collections;<a name="line.28"></a>
 <span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileSystem;<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.HConstants;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>// imports for things that haven't moved from regionserver.wal yet.<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>/**<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * A WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * interactions with HDFS.<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * &lt;p&gt;<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * separated list of allowed operations:<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;ul&gt;<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * filesystem.&lt;/li&gt;<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * &lt;/ul&gt;<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.59"></a>
-<span class="sourceLineNo">060</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * also undefined if values not listed above are included.<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * &lt;p&gt;<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * no-ops.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * &lt;p&gt;<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> */<a name="line.69"></a>
-<span class="sourceLineNo">070</span>@InterfaceAudience.Private<a name="line.70"></a>
-<span class="sourceLineNo">071</span>public class IOTestProvider implements WALProvider {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private enum AllowedOperations {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    all,<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    append,<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    sync,<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    fileroll,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    none<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>  private WALFactory factory;<a name="line.83"></a>
+<span class="sourceLineNo">030</span>import java.util.concurrent.atomic.AtomicBoolean;<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.FileSystem;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.Path;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HConstants;<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>// imports for things that haven't moved from regionserver.wal yet.<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.wal.WAL.Entry;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.slf4j.Logger;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.slf4j.LoggerFactory;<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 WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * interactions with HDFS.<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * &lt;p&gt;<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * This implementation picks a directory in HDFS based on the same mechanisms as the<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * {@link FSHLogProvider}. Users can configure how much interaction we have with HDFS with the<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * configuration property "hbase.wal.iotestprovider.operations". The value should be a comma<a name="line.53"></a>
+<span class="sourceLineNo">054</span> * separated list of allowed operations:<a name="line.54"></a>
+<span class="sourceLineNo">055</span> * &lt;ul&gt;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;li&gt;&lt;em&gt;append&lt;/em&gt; : edits will be written to the underlying filesystem&lt;/li&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> * &lt;li&gt;&lt;em&gt;sync&lt;/em&gt; : wal syncs will result in hflush calls&lt;/li&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * &lt;li&gt;&lt;em&gt;fileroll&lt;/em&gt; : roll requests will result in creating a new file on the underlying<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * filesystem.&lt;/li&gt;<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * &lt;/ul&gt;<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * Additionally, the special cases "all" and "none" are recognized. If ommited, the value defaults<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * to "all." Behavior is undefined if "all" or "none" are paired with additional values. Behavior is<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * also undefined if values not listed above are included.<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;p&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * Only those operations listed will occur between the returned WAL and HDFS. All others will be<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * no-ops.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * Note that in the case of allowing "append" operations but not allowing "fileroll", the returned<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * WAL will just keep writing to the same file. This won't avoid all costs associated with file<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * management over time, becaue the data set size may result in additional HDFS block allocations.<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 class IOTestProvider implements WALProvider {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  private static final Logger LOG = LoggerFactory.getLogger(IOTestProvider.class);<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private static final String ALLOWED_OPERATIONS = "hbase.wal.iotestprovider.operations";<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private enum AllowedOperations {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    all,<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    append,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    sync,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    fileroll,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    none<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
 <span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private Configuration conf;<a name="line.85"></a>
+<span class="sourceLineNo">085</span>  private WALFactory factory;<a name="line.85"></a>
 <span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private volatile FSHLog log;<a name="line.87"></a>
+<span class="sourceLineNo">087</span>  private Configuration conf;<a name="line.87"></a>
 <span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private String providerId;<a name="line.89"></a>
+<span class="sourceLineNo">089</span>  private volatile FSHLog log;<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @param conf may not be null<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   *                   null<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  @Override<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    if (factory != null) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    this.factory = factory;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this.conf = conf;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public List&lt;WAL&gt; getWALs() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    return Collections.singletonList(log);<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>  private FSHLog createWAL() throws IOException {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<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>  @Override<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FSHLog log = this.log;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    if (log != null) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return log;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    synchronized (this) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      log = this.log;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      if (log == null) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>        log = createWAL();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        this.log = log;<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>    return log;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public void close() throws IOException {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    FSHLog log = this.log;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    if (log != null) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      log.close();<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  @Override<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  public void shutdown() throws IOException {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    FSHLog log = this.log;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (log != null) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      log.shutdown();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static class IOTestWAL extends FSHLog {<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final boolean doFileRolls;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    private final boolean initialized;<a name="line.158"></a>
+<span class="sourceLineNo">091</span>  private String providerId;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  protected AtomicBoolean initialized = new AtomicBoolean(false);<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @param factory factory that made us, identity used for FS layout. may not be null<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * @param conf may not be null<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * @param providerId differentiate between providers from one facotry, used for FS layout. may be<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   *                   null<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  public void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    if (!initialized.compareAndSet(false, true)) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    this.factory = factory;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    this.conf = conf;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    this.providerId = providerId != null ? providerId : DEFAULT_PROVIDER_ID;<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>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public List&lt;WAL&gt; getWALs() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return Collections.singletonList(log);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  private FSHLog createWAL() throws IOException {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    String logPrefix = factory.factoryId + WAL_FILE_NAME_DELIMITER + providerId;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return new IOTestWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        AbstractFSWALProvider.getWALDirectoryName(factory.factoryId),<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        HConstants.HREGION_OLDLOGDIR_NAME, conf, listeners, true, logPrefix,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @Override<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    FSHLog log = this.log;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (log != null) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      return log;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    synchronized (this) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      log = this.log;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (log == null) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        log = createWAL();<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        this.log = log;<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>    return log;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public void close() throws IOException {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    FSHLog log = this.log;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (log != null) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      log.close();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  @Override<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public void shutdown() throws IOException {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    FSHLog log = this.log;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (log != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      log.shutdown();<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>  private static class IOTestWAL extends FSHLog {<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>    private final boolean doFileRolls;<a name="line.158"></a>
 <span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>    /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>     *<a name="line.162"></a>
-<span class="sourceLineNo">163</span>     * You should never have to load an existing log. If there is a log at<a name="line.163"></a>
-<span class="sourceLineNo">164</span>     * startup, it should have already been processed and deleted by the time the<a name="line.164"></a>
-<span class="sourceLineNo">165</span>     * WAL object is started up.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>     *<a name="line.166"></a>
-<span class="sourceLineNo">167</span>     * @param fs filesystem handle<a name="line.167"></a>
-<span class="sourceLineNo">168</span>     * @param rootDir path to where logs and oldlogs<a name="line.168"></a>
-<span class="sourceLineNo">169</span>     * @param logDir dir where wals are stored<a name="line.169"></a>
-<span class="sourceLineNo">170</span>     * @param archiveDir dir where wals are archived<a name="line.170"></a>
-<span class="sourceLineNo">171</span>     * @param conf configuration to use<a name="line.171"></a>
-<span class="sourceLineNo">172</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.172"></a>
-<span class="sourceLineNo">173</span>     * be registered before we do anything else; e.g. the<a name="line.173"></a>
-<span class="sourceLineNo">174</span>     * Constructor {@link #rollWriter()}.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.175"></a>
-<span class="sourceLineNo">176</span>     *        already exist.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.177"></a>
-<span class="sourceLineNo">178</span>     *        it will be URL encoded before being used.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>     *        If prefix is null, "wal" will be used<a name="line.179"></a>
-<span class="sourceLineNo">180</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.180"></a>
-<span class="sourceLineNo">181</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.181"></a>
-<span class="sourceLineNo">182</span>     * @throws IOException<a name="line.182"></a>
-<span class="sourceLineNo">183</span>     */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        final String archiveDir, final Configuration conf,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        throws IOException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.191"></a>
-<span class="sourceLineNo">192</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      initialized = true;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<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>    private Writer noRollsWriter;<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    // if we are skipping it, just keep returning the same writer.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    @Override<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // we don't know yet if we're supposed to generally roll and<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      if (!initialized || doFileRolls) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        LOG.info("creating new writer instance.");<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        try {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.212"></a>
-<span class="sourceLineNo">213</span>              "doesn't support needed stream capabilities.", exception);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        if (!initialized) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.216"></a>
-<span class="sourceLineNo">217</span>          noRollsWriter = writer;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        return writer;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      } else {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        // a race for first assignment.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        return noRollsWriter;<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><a name="line.228"></a>
-<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    private boolean doAppends;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    private boolean doSyncs;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>    @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        doAppends = doSyncs = true;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        doAppends = doSyncs = false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      } else {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    protected String getWriterClassName() {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      return ProtobufLogWriter.class.getSimpleName();<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>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public void append(Entry entry) throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (doAppends) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>        super.append(entry);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    @Override<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    public void sync(boolean forceSync) throws IOException {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (doSyncs) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        super.sync(forceSync);<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><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getNumLogFiles() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return this.log.getNumLogFiles();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @Override<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public long getLogFileSize() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // TODO Implement WALProvider.addWALActionLister<a name="line.285"></a>
-<span class="sourceLineNo">286</span><a name="line.286"></a>
-<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>}<a name="line.288"></a>
+<span class="sourceLineNo">160</span>    // Used to differntiate between roll calls before and after we finish construction.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    private final boolean initialized;<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>     * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>     *<a name="line.165"></a>
+<span class="sourceLineNo">166</span>     * You should never have to load an existing log. If there is a log at<a name="line.166"></a>
+<span class="sourceLineNo">167</span>     * startup, it should have already been processed and deleted by the time the<a name="line.167"></a>
+<span class="sourceLineNo">168</span>     * WAL object is started up.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>     *<a name="line.169"></a>
+<span class="sourceLineNo">170</span>     * @param fs filesystem handle<a name="line.170"></a>
+<span class="sourceLineNo">171</span>     * @param rootDir path to where logs and oldlogs<a name="line.171"></a>
+<span class="sourceLineNo">172</span>     * @param logDir dir where wals are stored<a name="line.172"></a>
+<span class="sourceLineNo">173</span>     * @param archiveDir dir where wals are archived<a name="line.173"></a>
+<span class="sourceLineNo">174</span>     * @param conf configuration to use<a name="line.174"></a>
+<span class="sourceLineNo">175</span>     * @param listeners Listeners on WAL events. Listeners passed here will<a name="line.175"></a>
+<span class="sourceLineNo">176</span>     * be registered before we do anything else; e.g. the<a name="line.176"></a>
+<span class="sourceLineNo">177</span>     * Constructor {@link #rollWriter()}.<a name="line.177"></a>
+<span class="sourceLineNo">178</span>     * @param failIfWALExists If true IOException will be thrown if files related to this wal<a name="line.178"></a>
+<span class="sourceLineNo">179</span>     *        already exist.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>     * @param prefix should always be hostname and port in distributed env and<a name="line.180"></a>
+<span class="sourceLineNo">181</span>     *        it will be URL encoded before being used.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>     *        If prefix is null, "wal" will be used<a name="line.182"></a>
+<span class="sourceLineNo">183</span>     * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.183"></a>
+<span class="sourceLineNo">184</span>     *        {@link AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.184"></a>
+<span class="sourceLineNo">185</span>     * @throws IOException<a name="line.185"></a>
+<span class="sourceLineNo">186</span>     */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    public IOTestWAL(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        final String archiveDir, final Configuration conf,<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        final List&lt;WALActionsListener&gt; listeners,<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        final boolean failIfWALExists, final String prefix, final String suffix)<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        throws IOException {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      doFileRolls = operations.isEmpty() || operations.contains(AllowedOperations.all.name()) ||<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          operations.contains(AllowedOperations.fileroll.name());<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      initialized = true;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      LOG.info("Initialized with file rolling " + (doFileRolls ? "enabled" : "disabled"));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>    private Writer noRollsWriter;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    // creatWriterInstance is where the new pipeline is set up for doing file rolls<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    // if we are skipping it, just keep returning the same writer.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    @Override<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // we get called from the FSHLog constructor (!); always roll in this case since<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // we don't know yet if we're supposed to generally roll and<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      // we need an initial file in the case of doing appends but no rolls.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      if (!initialized || doFileRolls) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        LOG.info("creating new writer instance.");<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        final ProtobufLogWriter writer = new IOTestWriter();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        try {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          writer.init(fs, path, conf, false, this.blocksize);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          throw new IOException("Can't create writer instance because underlying FileSystem " +<a name="line.215"></a>
+<span class="sourceLineNo">216</span>              "doesn't support needed stream capabilities.", exception);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        if (!initialized) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          LOG.info("storing initial writer instance in case file rolling isn't allowed.");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          noRollsWriter = writer;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        return writer;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      } else {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        LOG.info("WAL rolling disabled, returning the first writer.");<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        // Initial assignment happens during the constructor call, so there ought not be<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        // a race for first assignment.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        return noRollsWriter;<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>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Presumes init will be called by a single thread prior to any access of other methods.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   */<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  private static class IOTestWriter extends ProtobufLogWriter {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    private boolean doAppends;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    private boolean doSyncs;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>    @Override<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    public void init(FileSystem fs, Path path, Configuration conf, boolean overwritable,<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        long blocksize) throws IOException, CommonFSUtils.StreamLacksCapabilityException {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      Collection&lt;String&gt; operations = conf.getStringCollection(ALLOWED_OPERATIONS);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      if (operations.isEmpty() || operations.contains(AllowedOperations.all.name())) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        doAppends = doSyncs = true;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      } else if (operations.contains(AllowedOperations.none.name())) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        doAppends = doSyncs = false;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      } else {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        doAppends = operations.contains(AllowedOperations.append.name());<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        doSyncs = operations.contains(AllowedOperations.sync.name());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      LOG.info("IOTestWriter initialized with appends " + (doAppends ? "enabled" : "disabled") +<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          " and syncs " + (doSyncs ? "enabled" : "disabled"));<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      super.init(fs, path, conf, overwritable, blocksize);<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>    @Override<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    protected String getWriterClassName() {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return ProtobufLogWriter.class.getSimpleName();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>    @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    public void append(Entry entry) throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (doAppends) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        super.append(entry);<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>    @Override<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public void sync(boolean forceSync) throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (doSyncs) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        super.sync(forceSync);<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">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  public long getNumLogFiles() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    return this.log.getNumLogFiles();<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>  @Override<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  public long getLogFileSize() {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    return this.log.getLogFileSize();<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>  @Override<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // TODO Implement WALProvider.addWALActionLister<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>
 
 
 


[11/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.


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

Branch: refs/heads/asf-site
Commit: 6b0020b160a54417788b0ab36d1f12a413125e26
Parents: 76087e7
Author: jenkins <bu...@apache.org>
Authored: Thu Oct 11 14:52:39 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Thu Oct 11 14:52:39 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |   4 +-
 apache_hbase_reference_guide.pdf                |   4 +-
 book.html                                       |   2 +-
 bulk-loads.html                                 |   4 +-
 checkstyle-aggregate.html                       |  22 +-
 coc.html                                        |   4 +-
 dependencies.html                               |   4 +-
 dependency-convergence.html                     |   4 +-
 dependency-info.html                            |   4 +-
 dependency-management.html                      |   4 +-
 devapidocs/constant-values.html                 |  27 +-
 devapidocs/index-all.html                       |  10 +-
 .../hadoop/hbase/backup/package-tree.html       |   2 +-
 .../hadoop/hbase/client/package-tree.html       |  24 +-
 .../hadoop/hbase/coprocessor/package-tree.html  |   2 +-
 .../hadoop/hbase/filter/package-tree.html       |   8 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |   4 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |   4 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |   2 +-
 .../hbase/master/balancer/package-tree.html     |   2 +-
 .../hadoop/hbase/master/package-tree.html       |   2 +-
 .../hbase/master/procedure/package-tree.html    |   4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |  14 +-
 .../hadoop/hbase/procedure2/package-tree.html   |   6 +-
 .../hadoop/hbase/quotas/package-tree.html       |   6 +-
 .../hadoop/hbase/regionserver/package-tree.html |  20 +-
 .../regionserver/querymatcher/package-tree.html |   2 +-
 .../hbase/regionserver/wal/package-tree.html    |   2 +-
 .../hadoop/hbase/replication/package-tree.html  |   2 +-
 .../hbase/security/access/package-tree.html     |   4 +-
 .../hadoop/hbase/security/package-tree.html     |   4 +-
 .../apache/hadoop/hbase/util/package-tree.html  |   8 +-
 ...oupingProvider.IdentityGroupingStrategy.html |   8 +-
 .../hbase/wal/RegionGroupingProvider.html       |  71 +-
 .../org/apache/hadoop/hbase/wal/WALFactory.html | 125 ++-
 .../hadoop/hbase/wal/class-use/WALProvider.html |   9 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |   2 +-
 .../org/apache/hadoop/hbase/Version.html        |   4 +-
 ...oupingProvider.IdentityGroupingStrategy.html | 325 ++++----
 ...GroupingProvider.RegionGroupingStrategy.html | 325 ++++----
 .../wal/RegionGroupingProvider.Strategies.html  | 325 ++++----
 .../hbase/wal/RegionGroupingProvider.html       | 325 ++++----
 .../hadoop/hbase/wal/WALFactory.Providers.html  | 816 ++++++++++---------
 .../org/apache/hadoop/hbase/wal/WALFactory.html | 816 ++++++++++---------
 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/index-all.html                   |   6 +
 .../hadoop/hbase/backup/package-tree.html       |   2 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |   2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |   8 +-
 .../hadoop/hbase/procedure/package-tree.html    |   8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |   2 +-
 .../hadoop/hbase/regionserver/package-tree.html |   4 +-
 .../apache/hadoop/hbase/test/package-tree.html  |   4 +-
 .../wal/IOTestProvider.AllowedOperations.html   |  16 +-
 .../hbase/wal/IOTestProvider.IOTestWAL.html     |  12 +-
 .../hbase/wal/IOTestProvider.IOTestWriter.html  |  16 +-
 .../apache/hadoop/hbase/wal/IOTestProvider.html |  55 +-
 .../apache/hadoop/hbase/wal/TestWALFactory.html |  62 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |   2 +-
 .../wal/IOTestProvider.AllowedOperations.html   | 511 ++++++------
 .../hbase/wal/IOTestProvider.IOTestWAL.html     | 511 ++++++------
 .../hbase/wal/IOTestProvider.IOTestWriter.html  | 511 ++++++------
 .../apache/hadoop/hbase/wal/IOTestProvider.html | 511 ++++++------
 .../TestWALFactory.DumbWALActionsListener.html  | 153 ++--
 .../apache/hadoop/hbase/wal/TestWALFactory.html | 153 ++--
 86 files changed, 3142 insertions(+), 2861 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 19aea71..839d473 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 10e22bf..486e94a 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:20181010143320+00'00')
-/CreationDate (D:20181010144902+00'00')
+/ModDate (D:20181011143327+00'00')
+/CreationDate (D:20181011144919+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 74ea7f0..4d1b766 100644
--- a/book.html
+++ b/book.html
@@ -41284,7 +41284,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-10-10 14:33:20 UTC
+Last updated 2018-10-11 14:33:27 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 2a807cc..2573a48 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -306,7 +306,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index e67082f..4aa20b1 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -9836,12 +9836,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>730</td>
+<td>731</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3501</td>
+<td>3500</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -19156,7 +19156,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 0 has parse error. Details: no viable alternative at input '   *' while parsing JAVADOC_TAG</td>
 <td>117</td></tr>
 <tr class="b">
@@ -116484,31 +116484,31 @@
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>173</td></tr>
+<td>176</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>174</td></tr>
+<td>177</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>182</td></tr>
+<td>185</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>241</td></tr>
+<td>244</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>243</td></tr></table></div>
+<td>246</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.NamespaceGroupingStrategy.java">org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java</h3>
 <table border="0" class="table table-striped">
@@ -117066,7 +117066,7 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>298</td></tr></table></div>
+<td>322</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALKey.java">org/apache/hadoop/hbase/wal/WALKey.java</h3>
 <table border="0" class="table table-striped">
@@ -117799,7 +117799,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 0cf17c9..9ad5c4c 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -375,7 +375,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 26153e6..da9e955 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 3b0e45a..eb83afc 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -879,7 +879,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index d1d8143..3edb315 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -313,7 +313,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 1fc6f2f..2b9ab1d 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -1005,7 +1005,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 265676f..f18aed8 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3824,7 +3824,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Wed Oct 10 14:44:02 UTC 2018"</code></td>
+<td class="colLast"><code>"Thu Oct 11 14:44:19 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3838,7 +3838,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"cb31728438a46d6fb733c748cc646f37"</code></td>
+<td class="colLast"><code>"9567fbd68d8644485c69dcccfa2a19e0"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -28980,13 +28980,20 @@
 <td class="colLast"><code>"hbase.wal.regiongrouping.delegate.provider"</code></td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.wal.RegionGroupingProvider.DELEGATE_PROVIDER_CLASS">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#DELEGATE_PROVIDER_CLASS">DELEGATE_PROVIDER_CLASS</a></code></td>
+<td class="colLast"><code>"hbase.wal.regiongrouping.delegate.provider.class"</code></td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.wal.RegionGroupingProvider.META_WAL_GROUP_NAME">
 <!--   -->
 </a><code>private&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#META_WAL_GROUP_NAME">META_WAL_GROUP_NAME</a></code></td>
 <td class="colLast"><code>"meta"</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.wal.RegionGroupingProvider.REGION_GROUPING_STRATEGY">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
@@ -29051,12 +29058,26 @@
 <td class="colLast"><code>"hbase.wal.meta_provider"</code></td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.wal.WALFactory.META_WAL_PROVIDER_CLASS">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/wal/WALFactory.html#META_WAL_PROVIDER_CLASS">META_WAL_PROVIDER_CLASS</a></code></td>
+<td class="colLast"><code>"hbase.wal.meta_provider.class"</code></td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.wal.WALFactory.WAL_PROVIDER">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/wal/WALFactory.html#WAL_PROVIDER">WAL_PROVIDER</a></code></td>
 <td class="colLast"><code>"hbase.wal.provider"</code></td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.wal.WALFactory.WAL_PROVIDER_CLASS">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/wal/WALFactory.html#WAL_PROVIDER_CLASS">WAL_PROVIDER_CLASS</a></code></td>
+<td class="colLast"><code>"hbase.wal.provider.class"</code></td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 51e1153..2a137a4 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -24008,6 +24008,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER">DEFAULT_WAL_PROVIDER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER_CLASS">DEFAULT_WAL_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HConstants.html#DEFAULT_WAL_STORAGE_POLICY">DEFAULT_WAL_STORAGE_POLICY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HConstants.html" title="class in org.apache.hadoop.hbase">HConstants</a></dt>
 <dd>
 <div class="block">By default we defer the WAL storage policy to HDFS</div>
@@ -24326,6 +24328,8 @@
 <dd>
 <div class="block">delegate provider for WAL creation/roll/close</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#DELEGATE_PROVIDER_CLASS">DELEGATE_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/RegionGroupingProvider.html" title="class in org.apache.hadoop.hbase.wal">RegionGroupingProvider</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HColumnDescriptor.html#delegatee">delegatee</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
@@ -46275,7 +46279,7 @@
 <dd>
 <div class="block">Return the provider for this Cipher</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-">getProviderClass(String, String)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-java.lang.String-">getProviderClass(String, String, String)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/SaslUtil.html#getQop-java.lang.String-">getQop(String)</a></span> - Static method in class org.apache.hadoop.hbase.security.<a href="org/apache/hadoop/hbase/security/SaslUtil.html" title="class in org.apache.hadoop.hbase.security">SaslUtil</a></dt>
 <dd>
@@ -73879,6 +73883,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#META_WAL_PROVIDER">META_WAL_PROVIDER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#META_WAL_PROVIDER_CLASS">META_WAL_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html#META_WAL_PROVIDER_ID">META_WAL_PROVIDER_ID</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html" title="class in org.apache.hadoop.hbase.wal">AbstractFSWALProvider</a></dt>
 <dd>
 <div class="block">The hbase:meta region's WAL filename extension</div>
@@ -122910,6 +122916,8 @@ the order they are declared.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#WAL_PROVIDER">WAL_PROVIDER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#WAL_PROVIDER_CLASS">WAL_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HConstants.html#WAL_STORAGE_POLICY">WAL_STORAGE_POLICY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HConstants.html" title="class in org.apache.hadoop.hbase">HConstants</a></dt>
 <dd>
 <div class="block">Configuration name of WAL storage policy

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index e67b778..329f62f 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -201,8 +201,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 </ul>
 </li>
 </ul>

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index abd92a9..1799704 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -198,8 +198,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 7a808ff..a3eaab0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,9 +216,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 </ul>
 </li>

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

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

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

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index 23060c2..3bd22b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 </ul>
 </li>
 </ul>

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

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


[05/11] hbase-site git commit: Published site at 72552301ab772122dc4dd39941ad1acbe831f1ff.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index a548abd..22567b5 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -491,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index c047626..2fee6c0 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 6c0cea6..0938acd 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index cf4597f..45acdd2 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -440,7 +440,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 2402e86..a745e35 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 9251ffc..f87797f 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 4e82f53..6016ce6 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index fb7f204..4009702 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index fad6409..7068006 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 5c631e3..b1dd6f9 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 569460d..a54cecb 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 2aa9c9e..3264529 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -303,7 +303,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index f8fe10e..80401a1 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 8b49579..15566fe 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index e8006ff..d3cd1fe 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 46dac91..53aaa93 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 61d7e73..669a46c 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="20181010" />
+    <meta name="Date-Revision-yyyymmdd" content="20181011" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -760,7 +760,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index aada04e..21310c6 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -21054,6 +21054,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/IntegrationTestRSGroup.html#initialized">initialized</a></span> - Static variable in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/IntegrationTestRSGroup.html" title="class in org.apache.hadoop.hbase.rsgroup">IntegrationTestRSGroup</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/IOTestProvider.html#initialized">initialized</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/IOTestProvider.html" title="class in org.apache.hadoop.hbase.wal">IOTestProvider</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#initialized">initialized</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html" title="class in org.apache.hadoop.hbase.wal">IOTestProvider.IOTestWAL</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatRegionScanner.html#initializeKVHeap-java.util.List-java.util.List-org.apache.hadoop.hbase.regionserver.HRegion-">initializeKVHeap(List&lt;KeyValueScanner&gt;, List&lt;KeyValueScanner&gt;, HRegion)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatRegionScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestScannerHeartbeatMessages.HeartbeatRegionScanner</a></dt>
@@ -49203,6 +49205,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#testCustomFilter--">testCustomFilter()</a></span> - Method in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestTableScan.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALFactory.html#testCustomMetaProvider--">testCustomMetaProvider()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALFactory.html" title="class in org.apache.hadoop.hbase.wal">TestWALFactory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestDefaultStoreEngine.html#testCustomParts--">testCustomParts()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestDefaultStoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">TestDefaultStoreEngine</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.html#testCustomPolicy--">testCustomPolicy()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionSplitPolicy</a></dt>
@@ -49211,6 +49215,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/TestCipherProvider.html#testCustomProvider--">testCustomProvider()</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.<a href="org/apache/hadoop/hbase/io/crypto/TestCipherProvider.html" title="class in org.apache.hadoop.hbase.io.crypto">TestCipherProvider</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALFactory.html#testCustomProvider--">testCustomProvider()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALFactory.html" title="class in org.apache.hadoop.hbase.wal">TestWALFactory</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#testCustomReplicationEndpoint--">testCustomReplicationEndpoint()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationEndpoint</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/wal/TestCustomWALCellCodec.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestCustomWALCellCodec</span></a> - Class in <a href="org/apache/hadoop/hbase/regionserver/wal/package-summary.html">org.apache.hadoop.hbase.regionserver.wal</a></dt>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index ec56445..4837d80 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/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 45a79ba..eb35811 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -579,15 +579,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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/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/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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
index 28973e0..a1c9b1d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
@@ -81,14 +81,14 @@
 <ul>
 <li type="circle">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"><span class="typeNameLink">Object</span></a>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;)
+<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
 </ul>
 </li>
-<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
+<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.procedure.ProcedureManager

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/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 3661437..037e54a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -214,8 +214,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.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/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/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/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 eb6d2c1..76f4e7c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -672,11 +672,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/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 e23761b..b306111 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,10 +253,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.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>
-<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/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
index 08765b5..dd3b9ad 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.75">IOTestProvider.AllowedOperations</a>
+<pre>private static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.77">IOTestProvider.AllowedOperations</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a>&gt;</pre>
 </li>
 </ul>
@@ -219,7 +219,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>all</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.76">all</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.78">all</a></pre>
 </li>
 </ul>
 <a name="append">
@@ -228,7 +228,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.77">append</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.79">append</a></pre>
 </li>
 </ul>
 <a name="sync">
@@ -237,7 +237,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>sync</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.78">sync</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.80">sync</a></pre>
 </li>
 </ul>
 <a name="fileroll">
@@ -246,7 +246,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>fileroll</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.79">fileroll</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.81">fileroll</a></pre>
 </li>
 </ul>
 <a name="none">
@@ -255,7 +255,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>none</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.80">none</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.82">none</a></pre>
 </li>
 </ul>
 </li>
@@ -272,7 +272,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.75">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.77">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -292,7 +292,7 @@ for (IOTestProvider.AllowedOperations c : IOTestProvider.AllowedOperations.value
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.75">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal">IOTestProvider.AllowedOperations</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html#line.77">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
index 13760b5..e28f4ad 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.153">IOTestProvider.IOTestWAL</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.156">IOTestProvider.IOTestWAL</a>
 extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 </li>
 </ul>
@@ -276,7 +276,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doFileRolls</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.155">doFileRolls</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.158">doFileRolls</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -285,7 +285,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>initialized</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.158">initialized</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.161">initialized</a></pre>
 </li>
 </ul>
 <a name="noRollsWriter">
@@ -294,7 +294,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>noRollsWriter</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.wal.WALProvider.Writer <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.197">noRollsWriter</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.wal.WALProvider.Writer <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.200">noRollsWriter</a></pre>
 </li>
 </ul>
 </li>
@@ -311,7 +311,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IOTestWAL</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.184">IOTestWAL</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.187">IOTestWAL</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                  org.apache.hadoop.fs.Path&nbsp;rootDir,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;logDir,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;archiveDir,
@@ -362,7 +362,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createWriterInstance</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.wal.WALProvider.Writer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.202">createWriterInstance</a>(org.apache.hadoop.fs.Path&nbsp;path)
+<pre>protected&nbsp;org.apache.hadoop.hbase.wal.WALProvider.Writer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#line.205">createWriterInstance</a>(org.apache.hadoop.fs.Path&nbsp;path)
                                                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
index 2e5e7c8..8934581 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.232">IOTestProvider.IOTestWriter</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.235">IOTestProvider.IOTestWriter</a>
 extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <div class="block">Presumes init will be called by a single thread prior to any access of other methods.</div>
 </li>
@@ -273,7 +273,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doAppends</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.233">doAppends</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.236">doAppends</a></pre>
 </li>
 </ul>
 <a name="doSyncs">
@@ -282,7 +282,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doSyncs</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.234">doSyncs</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.237">doSyncs</a></pre>
 </li>
 </ul>
 </li>
@@ -299,7 +299,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IOTestWriter</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.232">IOTestWriter</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.235">IOTestWriter</a>()</pre>
 </li>
 </ul>
 </li>
@@ -316,7 +316,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.237">init</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.240">init</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                  org.apache.hadoop.fs.Path&nbsp;path,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
                  boolean&nbsp;overwritable,
@@ -340,7 +340,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriterClassName</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.254">getWriterClassName</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.257">getWriterClassName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code>getWriterClassName</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.regionserver.wal.AbstractProtobufLogWriter</code></dd>
@@ -353,7 +353,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.259">append</a>(org.apache.hadoop.hbase.wal.WAL.Entry&nbsp;entry)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.262">append</a>(org.apache.hadoop.hbase.wal.WAL.Entry&nbsp;entry)
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -371,7 +371,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.266">sync</a>(boolean&nbsp;forceSync)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.269">sync</a>(boolean&nbsp;forceSync)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.html b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.html
index 7a2aad3..7d93735 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.71">IOTestProvider</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.73">IOTestProvider</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <div class="block">A WAL Provider that returns a single thread safe WAL that optionally can skip parts of our normal
@@ -207,18 +207,22 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.html#factory">factory</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.html#initialized">initialized</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.regionserver.wal.WALActionsListener&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.html#listeners">listeners</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.wal.FSHLog</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.html#log">log</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/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/wal/IOTestProvider.html#providerId">providerId</a></span></code>&nbsp;</td>
 </tr>
@@ -327,7 +331,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.72">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.74">LOG</a></pre>
 </li>
 </ul>
 <a name="ALLOWED_OPERATIONS">
@@ -336,7 +340,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ALLOWED_OPERATIONS</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.74">ALLOWED_OPERATIONS</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.76">ALLOWED_OPERATIONS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.IOTestProvider.ALLOWED_OPERATIONS">Constant Field Values</a></dd>
@@ -349,7 +353,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>factory</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.wal.WALFactory <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.83">factory</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.wal.WALFactory <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.85">factory</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -358,7 +362,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.85">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.87">conf</a></pre>
 </li>
 </ul>
 <a name="log">
@@ -367,7 +371,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>log</h4>
-<pre>private volatile&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.87">log</a></pre>
+<pre>private volatile&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.89">log</a></pre>
 </li>
 </ul>
 <a name="providerId">
@@ -376,7 +380,16 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>providerId</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.89">providerId</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.91">providerId</a></pre>
+</li>
+</ul>
+<a name="initialized">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>initialized</h4>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.92">initialized</a></pre>
 </li>
 </ul>
 <a name="listeners">
@@ -385,7 +398,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>listeners</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.regionserver.wal.WALActionsListener&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.91">listeners</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.regionserver.wal.WALActionsListener&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.94">listeners</a></pre>
 </li>
 </ul>
 </li>
@@ -402,7 +415,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IOTestProvider</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.71">IOTestProvider</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.73">IOTestProvider</a>()</pre>
 </li>
 </ul>
 </li>
@@ -419,7 +432,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.99">init</a>(org.apache.hadoop.hbase.wal.WALFactory&nbsp;factory,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.102">init</a>(org.apache.hadoop.hbase.wal.WALFactory&nbsp;factory,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;providerId)
           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>
@@ -442,7 +455,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.wal.WAL&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.109">getWALs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.wal.WAL&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.112">getWALs</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getWALs</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.wal.WALProvider</code></dd>
@@ -455,7 +468,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>createWAL</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.113">createWAL</a>()
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.116">createWAL</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>
@@ -469,7 +482,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.122">getWAL</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;region)
+<pre>public&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.125">getWAL</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;region)
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -485,7 +498,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.138">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.141">close</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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -501,7 +514,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.146">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.149">shutdown</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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -517,7 +530,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumLogFiles</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.274">getNumLogFiles</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.277">getNumLogFiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getNumLogFiles</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.wal.WALProvider</code></dd>
@@ -530,7 +543,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.279">getLogFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.282">getLogFileSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getLogFileSize</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.wal.WALProvider</code></dd>
@@ -543,7 +556,7 @@ implements org.apache.hadoop.hbase.wal.WALProvider</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>addWALActionsListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.284">addWALActionsListener</a>(org.apache.hadoop.hbase.regionserver.wal.WALActionsListener&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.html#line.287">addWALActionsListener</a>(org.apache.hadoop.hbase.regionserver.wal.WALActionsListener&nbsp;listener)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>addWALActionsListener</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.wal.WALProvider</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b0020b1/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html b/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
index b278256..88ee18f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/TestWALFactory.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":10,"i5":9,"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};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -265,45 +265,53 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testDefaultProvider--">testDefaultProvider</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testCustomMetaProvider--">testCustomMetaProvider</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i9" class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testCustomProvider--">testCustomProvider</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i10" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testDefaultProvider--">testDefaultProvider</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testEditAdd--">testEditAdd</a></span>()</code>
 <div class="block">Tests that we can write out an edit, close, and then read it back in again.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testOnlySetMetaWALProvider--">testOnlySetMetaWALProvider</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testOnlySetWALProvider--">testOnlySetWALProvider</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testSplit--">testSplit</a></span>()</code>
 <div class="block">Just write multiple logs then split.</div>
 </td>
 </tr>
-<tr id="i13" class="rowColor">
+<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/wal/TestWALFactory.html#testVisitors--">testVisitors</a></span>()</code>
 <div class="block">Test that we can visit entries before they are appended</div>
 </td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testWALCoprocessorLoaded--">testWALCoprocessorLoaded</a></span>()</code>
 <div class="block">A loaded WAL coprocessor won't break existing WAL test cases.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#testWALProviders--">testWALProviders</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/TestWALFactory.html#verifySplits-java.util.List-int-">verifySplits</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;splits,
             int&nbsp;howmany)</code>&nbsp;</td>
@@ -672,7 +680,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOnlySetWALProvider</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.697">testOnlySetWALProvider</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.698">testOnlySetWALProvider</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>
@@ -686,7 +694,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOnlySetMetaWALProvider</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.711">testOnlySetMetaWALProvider</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.713">testOnlySetMetaWALProvider</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>
@@ -697,10 +705,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testDefaultProvider--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testDefaultProvider</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.724">testDefaultProvider</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.727">testDefaultProvider</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>
@@ -708,6 +716,34 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testCustomProvider--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testCustomProvider</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.750">testCustomProvider</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="testCustomMetaProvider--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testCustomMetaProvider</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/TestWALFactory.html#line.762">testCustomMetaProvider</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>
 </li>
 </ul>
 </li>

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